LibASTMatchersReference.html 387 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. "http://www.w3.org/TR/html4/strict.dtd">
  3. <html>
  4. <head>
  5. <title>AST Matcher Reference</title>
  6. <link type="text/css" rel="stylesheet" href="../menu.css" />
  7. <link type="text/css" rel="stylesheet" href="../content.css" />
  8. <style type="text/css">
  9. td {
  10. padding: .33em;
  11. }
  12. td.doc {
  13. display: none;
  14. border-bottom: 1px solid black;
  15. }
  16. td.name:hover {
  17. color: blue;
  18. cursor: pointer;
  19. }
  20. </style>
  21. <script type="text/javascript">
  22. function toggle(id) {
  23. if (!id) return;
  24. row = document.getElementById(id);
  25. if (row.style.display != 'table-cell')
  26. row.style.display = 'table-cell';
  27. else
  28. row.style.display = 'none';
  29. }
  30. </script>
  31. </head>
  32. <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
  33. <!--#include virtual="../menu.html.incl"-->
  34. <div id="content">
  35. <h1>AST Matcher Reference</h1>
  36. <p>This document shows all currently implemented matchers. The matchers are grouped
  37. by category and node type they match. You can click on matcher names to show the
  38. matcher's source documentation.</p>
  39. <p>There are three different basic categories of matchers:
  40. <ul>
  41. <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
  42. <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
  43. <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
  44. </ul>
  45. </p>
  46. <p>Within each category the matchers are ordered by node type they match on.
  47. Note that if a matcher can match multiple node types, it will it will appear
  48. multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
  49. find all matchers that can be used to match on Stmt nodes.</p>
  50. <p>The exception to that rule are matchers that can match on any node. Those
  51. are marked with a * and are listed in the beginning of each category.</p>
  52. <p>Note that the categorization of matchers is a great help when you combine
  53. them into matcher expressions. You will usually want to form matcher expressions
  54. that read like english sentences by alternating between node matchers and
  55. narrowing or traversal matchers, like this:
  56. <pre>
  57. recordDecl(hasDescendant(
  58. ifStmt(hasTrueExpression(
  59. expr(hasDescendant(
  60. ifStmt()))))))
  61. </pre>
  62. </p>
  63. <!-- ======================================================================= -->
  64. <h2 id="decl-matchers">Node Matchers</h2>
  65. <!-- ======================================================================= -->
  66. <p>Node matchers are at the core of matcher expressions - they specify the type
  67. of node that is expected. Every match expression starts with a node matcher,
  68. which can then be further refined with a narrowing or traversal matcher. All
  69. traversal matchers take node matchers as their arguments.</p>
  70. <p>For convenience, all node matchers take an arbitrary number of arguments
  71. and implicitly act as allOf matchers.</p>
  72. <p>Node matchers are the only matchers that support the bind("id") call to
  73. bind the matched node to the given string, to be later retrieved from the
  74. match callback.</p>
  75. <p>It is important to remember that the arguments to node matchers are
  76. predicates on the same node, just with additional information about the type.
  77. This is often useful to make matcher expression more readable by inlining bind
  78. calls into redundant node matchers inside another node matcher:
  79. <pre>
  80. // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
  81. // the same node.
  82. recordDecl(decl().bind("id"), hasName("::MyClass"))
  83. </pre>
  84. </p>
  85. <table>
  86. <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
  87. <!-- START_DECL_MATCHERS -->
  88. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
  89. <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
  90. Examples matches i(42).
  91. class C {
  92. C() : i(42) {}
  93. int i;
  94. };
  95. </pre></td></tr>
  96. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
  97. <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
  98. Given
  99. class C {
  100. public:
  101. int a;
  102. };
  103. accessSpecDecl()
  104. matches 'public:'
  105. </pre></td></tr>
  106. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
  107. <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
  108. Example matches the declaration of the nameless block printing an input
  109. integer.
  110. myFunc(^(int p) {
  111. printf("%d", p);
  112. })
  113. </pre></td></tr>
  114. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
  115. <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
  116. Example matches Z
  117. template&lt;class T&gt; class Z {};
  118. </pre></td></tr>
  119. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
  120. <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
  121. Given
  122. template&lt;class T1, class T2, int I&gt;
  123. class A {};
  124. template&lt;class T, int I&gt;
  125. class A&lt;T, T*, I&gt; {};
  126. template&lt;&gt;
  127. class A&lt;int, int, 1&gt; {};
  128. classTemplatePartialSpecializationDecl()
  129. matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
  130. </pre></td></tr>
  131. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
  132. <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
  133. Given
  134. template&lt;typename T&gt; class A {};
  135. template&lt;&gt; class A&lt;double&gt; {};
  136. A&lt;int&gt; a;
  137. classTemplateSpecializationDecl()
  138. matches the specializations A&lt;int&gt; and A&lt;double&gt;
  139. </pre></td></tr>
  140. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
  141. <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
  142. Example matches Foo::Foo() and Foo::Foo(int)
  143. class Foo {
  144. public:
  145. Foo();
  146. Foo(int);
  147. int DoSomething();
  148. };
  149. </pre></td></tr>
  150. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
  151. <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
  152. Example matches the operator.
  153. class X { operator int() const; };
  154. </pre></td></tr>
  155. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
  156. <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
  157. Example matches the deduction guide.
  158. template&lt;typename T&gt;
  159. class X { X(int) };
  160. X(int) -&gt; X&lt;int&gt;;
  161. </pre></td></tr>
  162. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
  163. <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
  164. Example matches Foo::~Foo()
  165. class Foo {
  166. public:
  167. virtual ~Foo();
  168. };
  169. </pre></td></tr>
  170. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
  171. <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
  172. Example matches y
  173. class X { void y(); };
  174. </pre></td></tr>
  175. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
  176. <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
  177. Example matches X, Z
  178. class X;
  179. template&lt;class T&gt; class Z {};
  180. </pre></td></tr>
  181. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
  182. <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
  183. Examples matches X, C, and the friend declaration inside C;
  184. void X();
  185. class C {
  186. friend X;
  187. };
  188. </pre></td></tr>
  189. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
  190. <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
  191. and non-type template parameter declarations).
  192. Given
  193. class X { int y; };
  194. declaratorDecl()
  195. matches int y.
  196. </pre></td></tr>
  197. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
  198. <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
  199. Example matches A, B, C
  200. enum X {
  201. A, B, C
  202. };
  203. </pre></td></tr>
  204. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
  205. <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
  206. Example matches X
  207. enum X {
  208. A, B, C
  209. };
  210. </pre></td></tr>
  211. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
  212. <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
  213. Given
  214. class X { int m; };
  215. fieldDecl()
  216. matches 'm'.
  217. </pre></td></tr>
  218. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
  219. <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
  220. Given
  221. class X { friend void foo(); };
  222. friendDecl()
  223. matches 'friend void foo()'.
  224. </pre></td></tr>
  225. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
  226. <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
  227. Example matches f
  228. void f();
  229. </pre></td></tr>
  230. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
  231. <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
  232. Example matches f
  233. template&lt;class T&gt; void f(T t) {}
  234. </pre></td></tr>
  235. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
  236. <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
  237. Given
  238. struct X { struct { int a; }; };
  239. indirectFieldDecl()
  240. matches 'a'.
  241. </pre></td></tr>
  242. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
  243. <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
  244. Given
  245. goto FOO;
  246. FOO: bar();
  247. labelDecl()
  248. matches 'FOO:'
  249. </pre></td></tr>
  250. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
  251. <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
  252. Given
  253. extern "C" {}
  254. linkageSpecDecl()
  255. matches "extern "C" {}"
  256. </pre></td></tr>
  257. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
  258. <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
  259. Example matches X, S, the anonymous union type, i, and U;
  260. typedef int X;
  261. struct S {
  262. union {
  263. int i;
  264. } U;
  265. };
  266. </pre></td></tr>
  267. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
  268. <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
  269. Given
  270. namespace test {}
  271. namespace alias = ::test;
  272. namespaceAliasDecl()
  273. matches "namespace alias" but not "namespace test"
  274. </pre></td></tr>
  275. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
  276. <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
  277. Given
  278. namespace {}
  279. namespace test {}
  280. namespaceDecl()
  281. matches "namespace {}" and "namespace test {}"
  282. </pre></td></tr>
  283. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
  284. <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
  285. Given
  286. template &lt;typename T, int N&gt; struct C {};
  287. nonTypeTemplateParmDecl()
  288. matches 'N', but not 'T'.
  289. </pre></td></tr>
  290. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
  291. <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
  292. Example matches Foo (Additions)
  293. @interface Foo (Additions)
  294. @end
  295. </pre></td></tr>
  296. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
  297. <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
  298. Example matches Foo (Additions)
  299. @implementation Foo (Additions)
  300. @end
  301. </pre></td></tr>
  302. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
  303. <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
  304. Example matches Foo
  305. @implementation Foo
  306. @end
  307. </pre></td></tr>
  308. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
  309. <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
  310. Example matches Foo
  311. @interface Foo
  312. @end
  313. </pre></td></tr>
  314. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
  315. <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
  316. Example matches _enabled
  317. @implementation Foo {
  318. BOOL _enabled;
  319. }
  320. @end
  321. </pre></td></tr>
  322. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
  323. <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
  324. Example matches both declaration and definition of -[Foo method]
  325. @interface Foo
  326. - (void)method;
  327. @end
  328. @implementation Foo
  329. - (void)method {}
  330. @end
  331. </pre></td></tr>
  332. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
  333. <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
  334. Example matches enabled
  335. @interface Foo
  336. @property BOOL enabled;
  337. @end
  338. </pre></td></tr>
  339. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
  340. <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
  341. Example matches FooDelegate
  342. @protocol FooDelegate
  343. @end
  344. </pre></td></tr>
  345. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
  346. <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
  347. Given
  348. void f(int x);
  349. parmVarDecl()
  350. matches int x.
  351. </pre></td></tr>
  352. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
  353. <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
  354. Example matches X, Z, U, and S
  355. class X;
  356. template&lt;class T&gt; class Z {};
  357. struct S {};
  358. union U {};
  359. </pre></td></tr>
  360. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
  361. <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
  362. Example:
  363. staticAssertExpr()
  364. matches
  365. static_assert(sizeof(S) == sizeof(int))
  366. in
  367. struct S {
  368. int x;
  369. };
  370. static_assert(sizeof(S) == sizeof(int));
  371. </pre></td></tr>
  372. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
  373. <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
  374. Given
  375. template &lt;typename T, int N&gt; struct C {};
  376. templateTypeParmDecl()
  377. matches 'T', but not 'N'.
  378. </pre></td></tr>
  379. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
  380. <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
  381. Given
  382. int X;
  383. namespace NS {
  384. int Y;
  385. } // namespace NS
  386. decl(hasDeclContext(translationUnitDecl()))
  387. matches "int X", but not "int Y".
  388. </pre></td></tr>
  389. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
  390. <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
  391. Given
  392. typedef int X;
  393. using Y = int;
  394. typeAliasDecl()
  395. matches "using Y = int", but not "typedef int X"
  396. </pre></td></tr>
  397. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
  398. <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
  399. typeAliasTemplateDecl() matches
  400. template &lt;typename T&gt;
  401. using Y = X&lt;T&gt;;
  402. </pre></td></tr>
  403. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
  404. <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
  405. Given
  406. typedef int X;
  407. using Y = int;
  408. typedefDecl()
  409. matches "typedef int X", but not "using Y = int"
  410. </pre></td></tr>
  411. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
  412. <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
  413. Given
  414. typedef int X;
  415. using Y = int;
  416. typedefNameDecl()
  417. matches "typedef int X" and "using Y = int"
  418. </pre></td></tr>
  419. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
  420. <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
  421. typename.
  422. Given
  423. template &lt;typename T&gt;
  424. struct Base { typedef T Foo; };
  425. template&lt;typename T&gt;
  426. struct S : private Base&lt;T&gt; {
  427. using typename Base&lt;T&gt;::Foo;
  428. };
  429. unresolvedUsingTypenameDecl()
  430. matches using Base&lt;T&gt;::Foo </pre></td></tr>
  431. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
  432. <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
  433. Given
  434. template&lt;typename X&gt;
  435. class C : private X {
  436. using X::x;
  437. };
  438. unresolvedUsingValueDecl()
  439. matches using X::x </pre></td></tr>
  440. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
  441. <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
  442. Given
  443. namespace X { int x; }
  444. using X::x;
  445. usingDecl()
  446. matches using X::x </pre></td></tr>
  447. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
  448. <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
  449. Given
  450. namespace X { int x; }
  451. using namespace X;
  452. usingDirectiveDecl()
  453. matches using namespace X </pre></td></tr>
  454. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
  455. <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
  456. Example matches A, B, C and F
  457. enum X { A, B, C };
  458. void F();
  459. </pre></td></tr>
  460. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
  461. <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
  462. Note: this does not match declarations of member variables, which are
  463. "field" declarations in Clang parlance.
  464. Example matches a
  465. int a;
  466. </pre></td></tr>
  467. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
  468. <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
  469. </pre></td></tr>
  470. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
  471. <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
  472. Given
  473. namespace ns {
  474. struct A { static void f(); };
  475. void A::f() {}
  476. void g() { A::f(); }
  477. }
  478. ns::A a;
  479. nestedNameSpecifier()
  480. matches "ns::" and both "A::"
  481. </pre></td></tr>
  482. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
  483. <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
  484. Given
  485. #pragma omp parallel default(none)
  486. #pragma omp parallel default(shared)
  487. #pragma omp parallel
  488. ``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
  489. </pre></td></tr>
  490. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
  491. <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
  492. </pre></td></tr>
  493. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
  494. <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
  495. Given
  496. FOO: bar();
  497. void *ptr = &amp;&amp;FOO;
  498. goto *bar;
  499. addrLabelExpr()
  500. matches '&amp;&amp;FOO'
  501. </pre></td></tr>
  502. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
  503. <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
  504. Given
  505. int i = a[1];
  506. arraySubscriptExpr()
  507. matches "a[1]"
  508. </pre></td></tr>
  509. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
  510. <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
  511. int i = 100;
  512. __asm("mov al, 2");
  513. asmStmt()
  514. matches '__asm("mov al, 2")'
  515. </pre></td></tr>
  516. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
  517. <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
  518. Example matches __atomic_load_n(ptr, 1)
  519. void foo() { int *ptr; __atomic_load_n(ptr, 1); }
  520. </pre></td></tr>
  521. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
  522. <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
  523. Given
  524. @autoreleasepool {
  525. int x = 0;
  526. }
  527. autoreleasePoolStmt(stmt()) matches the declaration of "x"
  528. inside the autorelease pool.
  529. </pre></td></tr>
  530. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
  531. <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
  532. Example matches a ?: b
  533. (a ?: b) + 42;
  534. </pre></td></tr>
  535. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
  536. <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
  537. Example matches a || b
  538. !(a || b)
  539. </pre></td></tr>
  540. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
  541. <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
  542. Example: matches "^{}":
  543. void f() { ^{}(); }
  544. </pre></td></tr>
  545. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
  546. <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
  547. Given
  548. while (true) { break; }
  549. breakStmt()
  550. matches 'break'
  551. </pre></td></tr>
  552. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
  553. <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
  554. Example: Matches (int) 2.2f in
  555. int i = (int) 2.2f;
  556. </pre></td></tr>
  557. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
  558. <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
  559. Example matches x.y() and y()
  560. X x;
  561. x.y();
  562. y();
  563. </pre></td></tr>
  564. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
  565. <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
  566. Given
  567. switch(a) { case 42: break; default: break; }
  568. caseStmt()
  569. matches 'case 42:'.
  570. </pre></td></tr>
  571. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
  572. <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
  573. Example: castExpr() matches each of the following:
  574. (int) 3;
  575. const_cast&lt;Expr *&gt;(SubExpr);
  576. char c = 0;
  577. but does not match
  578. int i = (0);
  579. int k = 0;
  580. </pre></td></tr>
  581. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
  582. <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
  583. Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
  584. though.
  585. Example matches 'a', L'a'
  586. char ch = 'a';
  587. wchar_t chw = L'a';
  588. </pre></td></tr>
  589. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
  590. <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
  591. </pre></td></tr>
  592. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
  593. <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
  594. Example match: {1}, (1, 2)
  595. int array[4] = {1};
  596. vector int myvec = (vector int)(1, 2);
  597. </pre></td></tr>
  598. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
  599. <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
  600. Example matches '{}' and '{{}}' in 'for (;;) {{}}'
  601. for (;;) {{}}
  602. </pre></td></tr>
  603. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
  604. <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
  605. Example matches a ? b : c
  606. (a ? b : c) + 42
  607. </pre></td></tr>
  608. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
  609. <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
  610. Example matches the constant in the case statement:
  611. (matcher = constantExpr())
  612. switch (a) {
  613. case 37: break;
  614. }
  615. </pre></td></tr>
  616. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
  617. <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
  618. Given
  619. while (true) { continue; }
  620. continueStmt()
  621. matches 'continue'
  622. </pre></td></tr>
  623. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
  624. <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
  625. Example matches,
  626. kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
  627. </pre></td></tr>
  628. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
  629. <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
  630. Example matches FunctionTakesString(GetStringByValue())
  631. (matcher = cxxBindTemporaryExpr())
  632. FunctionTakesString(GetStringByValue());
  633. FunctionTakesStringByPointer(GetStringPointer());
  634. </pre></td></tr>
  635. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
  636. <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
  637. Example matches true
  638. true
  639. </pre></td></tr>
  640. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
  641. <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
  642. try {} catch(int i) {}
  643. cxxCatchStmt()
  644. matches 'catch(int i)'
  645. </pre></td></tr>
  646. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
  647. <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
  648. Example: Matches const_cast&lt;int*&gt;(&amp;r) in
  649. int n = 42;
  650. const int &amp;r(n);
  651. int* p = const_cast&lt;int*&gt;(&amp;r);
  652. </pre></td></tr>
  653. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
  654. <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
  655. Example matches string(ptr, n) and ptr within arguments of f
  656. (matcher = cxxConstructExpr())
  657. void f(const string &amp;a, const string &amp;b);
  658. char *ptr;
  659. int n;
  660. f(string(ptr, n), ptr);
  661. </pre></td></tr>
  662. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
  663. <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
  664. Example matches the CXXDefaultArgExpr placeholder inserted for the
  665. default value of the second parameter in the call expression f(42)
  666. (matcher = cxxDefaultArgExpr())
  667. void f(int x, int y = 0);
  668. f(42);
  669. </pre></td></tr>
  670. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
  671. <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
  672. Given
  673. delete X;
  674. cxxDeleteExpr()
  675. matches 'delete X'.
  676. </pre></td></tr>
  677. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
  678. <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
  679. resolved because the base expression or the member name was dependent.
  680. Given
  681. template &lt;class T&gt; void f() { T t; t.g(); }
  682. cxxDependentScopeMemberExpr()
  683. matches t.g
  684. </pre></td></tr>
  685. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
  686. <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
  687. Example:
  688. cxxDynamicCastExpr()
  689. matches
  690. dynamic_cast&lt;D*&gt;(&amp;b);
  691. in
  692. struct B { virtual ~B() {} }; struct D : B {};
  693. B b;
  694. D* p = dynamic_cast&lt;D*&gt;(&amp;b);
  695. </pre></td></tr>
  696. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
  697. <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
  698. cxxForRangeStmt() matches 'for (auto a : i)'
  699. int i[] = {1, 2, 3}; for (auto a : i);
  700. for(int j = 0; j &lt; 5; ++j);
  701. </pre></td></tr>
  702. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
  703. <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
  704. Example: Matches Foo(bar);
  705. Foo f = bar;
  706. Foo g = (Foo) bar;
  707. Foo h = Foo(bar);
  708. </pre></td></tr>
  709. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
  710. <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
  711. Example matches x.y()
  712. X x;
  713. x.y();
  714. </pre></td></tr>
  715. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
  716. <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
  717. Given
  718. new X;
  719. cxxNewExpr()
  720. matches 'new X'.
  721. </pre></td></tr>
  722. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
  723. <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
  724. </pre></td></tr>
  725. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
  726. <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
  727. Note that if an operator isn't overloaded, it won't match. Instead, use
  728. binaryOperator matcher.
  729. Currently it does not match operators such as new delete.
  730. FIXME: figure out why these do not match?
  731. Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
  732. (matcher = cxxOperatorCallExpr())
  733. ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
  734. ostream &amp;o; int b = 1, c = 1;
  735. o &lt;&lt; b &lt;&lt; c;
  736. </pre></td></tr>
  737. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
  738. <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
  739. Either the source expression or the destination type can be matched
  740. using has(), but hasDestinationType() is more specific and can be
  741. more readable.
  742. Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
  743. void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
  744. </pre></td></tr>
  745. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
  746. <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
  747. See also: hasDestinationType
  748. See also: reinterpretCast
  749. Example:
  750. cxxStaticCastExpr()
  751. matches
  752. static_cast&lt;long&gt;(8)
  753. in
  754. long eight(static_cast&lt;long&gt;(8));
  755. </pre></td></tr>
  756. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
  757. <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
  758. Given
  759. std::vector&lt;int&gt; a({ 1, 2, 3 });
  760. std::vector&lt;int&gt; b = { 4, 5 };
  761. int c[] = { 6, 7 };
  762. std::pair&lt;int, int&gt; d = { 8, 9 };
  763. cxxStdInitializerListExpr()
  764. matches "{ 1, 2, 3 }" and "{ 4, 5 }"
  765. </pre></td></tr>
  766. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
  767. <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
  768. Example: Matches Foo(bar, bar)
  769. Foo h = Foo(bar, bar);
  770. </pre></td></tr>
  771. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
  772. <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
  773. Example matches the implicit this expression in "return i".
  774. (matcher = cxxThisExpr())
  775. struct foo {
  776. int i;
  777. int f() { return i; }
  778. };
  779. </pre></td></tr>
  780. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
  781. <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
  782. try { throw 5; } catch(int i) {}
  783. cxxThrowExpr()
  784. matches 'throw 5'
  785. </pre></td></tr>
  786. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
  787. <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
  788. try {} catch(int i) {}
  789. cxxTryStmt()
  790. matches 'try {}'
  791. </pre></td></tr>
  792. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
  793. <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
  794. Example matches T(t) in return statement of f
  795. (matcher = cxxUnresolvedConstructExpr())
  796. template &lt;typename T&gt;
  797. void f(const T&amp; t) { return T(t); }
  798. </pre></td></tr>
  799. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
  800. <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
  801. Example matches x in if (x)
  802. bool x;
  803. if (x) {}
  804. </pre></td></tr>
  805. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
  806. <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
  807. Given
  808. int a;
  809. declStmt()
  810. matches 'int a'.
  811. </pre></td></tr>
  812. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
  813. <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
  814. Given
  815. switch(a) { case 42: break; default: break; }
  816. defaultStmt()
  817. matches 'default:'.
  818. </pre></td></tr>
  819. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
  820. <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
  821. Example: Matches { [2].y = 1.0, [0].x = 1.0 }
  822. point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
  823. </pre></td></tr>
  824. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
  825. <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
  826. Given
  827. do {} while (true);
  828. doStmt()
  829. matches 'do {} while(true)'
  830. </pre></td></tr>
  831. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
  832. <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
  833. Matches any cast expression written in user code, whether it be a
  834. C-style cast, a functional-style cast, or a keyword cast.
  835. Does not match implicit conversions.
  836. Note: the name "explicitCast" is chosen to match Clang's terminology, as
  837. Clang uses the term "cast" to apply to implicit conversions as well as to
  838. actual cast expressions.
  839. See also: hasDestinationType.
  840. Example: matches all five of the casts in
  841. int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
  842. but does not match the implicit conversion in
  843. long ell = 42;
  844. </pre></td></tr>
  845. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
  846. <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
  847. Example matches x()
  848. void f() { x(); }
  849. </pre></td></tr>
  850. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
  851. <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
  852. of the sub-expression's evaluation.
  853. Example matches std::string()
  854. const std::string str = std::string();
  855. </pre></td></tr>
  856. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
  857. <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
  858. 1.0, 1.0f, 1.0L and 1e10.
  859. Does not match implicit conversions such as
  860. float a = 10;
  861. </pre></td></tr>
  862. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
  863. <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
  864. Example matches 'for (;;) {}'
  865. for (;;) {}
  866. int i[] = {1, 2, 3}; for (auto a : i);
  867. </pre></td></tr>
  868. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
  869. <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
  870. </pre></td></tr>
  871. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
  872. <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
  873. Given
  874. goto FOO;
  875. FOO: bar();
  876. gotoStmt()
  877. matches 'goto FOO'
  878. </pre></td></tr>
  879. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
  880. <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
  881. Example matches 'if (x) {}'
  882. if (x) {}
  883. </pre></td></tr>
  884. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
  885. <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
  886. point literals e.g.: 1i, 1.0i
  887. </pre></td></tr>
  888. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
  889. <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
  890. This matches many different places, including function call return value
  891. eliding, as well as any type conversions.
  892. </pre></td></tr>
  893. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
  894. <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
  895. Given
  896. point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
  897. implicitValueInitExpr()
  898. matches "[0].y" (implicitly)
  899. </pre></td></tr>
  900. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
  901. <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
  902. Given
  903. int a[] = { 1, 2 };
  904. struct B { int x, y; };
  905. B b = { 5, 6 };
  906. initListExpr()
  907. matches "{ 1, 2 }" and "{ 5, 6 }"
  908. </pre></td></tr>
  909. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
  910. <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
  911. 1, 1L, 0x1 and 1U.
  912. Does not match character-encoded integers such as L'a'.
  913. </pre></td></tr>
  914. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
  915. <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
  916. Given
  917. goto FOO;
  918. FOO: bar();
  919. labelStmt()
  920. matches 'FOO:'
  921. </pre></td></tr>
  922. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
  923. <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
  924. Example matches [&amp;](){return 5;}
  925. [&amp;](){return 5;}
  926. </pre></td></tr>
  927. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
  928. <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
  929. Example: Given
  930. struct T {void func();};
  931. T f();
  932. void g(T);
  933. materializeTemporaryExpr() matches 'f()' in these statements
  934. T u(f());
  935. g(f());
  936. f().func();
  937. but does not match
  938. f();
  939. </pre></td></tr>
  940. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
  941. <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
  942. Given
  943. class Y {
  944. void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
  945. int a; static int b;
  946. };
  947. memberExpr()
  948. matches this-&gt;x, x, y.x, a, this-&gt;b
  949. </pre></td></tr>
  950. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
  951. <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
  952. foo();;
  953. nullStmt()
  954. matches the second ';'
  955. </pre></td></tr>
  956. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
  957. <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
  958. Example matches @catch
  959. @try {}
  960. @catch (...) {}
  961. </pre></td></tr>
  962. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
  963. <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
  964. Example matches @finally
  965. @try {}
  966. @finally {}
  967. </pre></td></tr>
  968. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
  969. <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
  970. Example: matches "a" in "init" method:
  971. @implementation A {
  972. NSString *a;
  973. }
  974. - (void) init {
  975. a = @"hello";
  976. }
  977. </pre></td></tr>
  978. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
  979. <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
  980. The innermost message send invokes the "alloc" class method on the
  981. NSString class, while the outermost message send invokes the
  982. "initWithString" instance method on the object returned from
  983. NSString's "alloc". This matcher should match both message sends.
  984. [[NSString alloc] initWithString:@"Hello"]
  985. </pre></td></tr>
  986. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
  987. <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
  988. Example matches @throw obj;
  989. </pre></td></tr>
  990. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
  991. <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
  992. Example matches @try
  993. @try {}
  994. @catch (...) {}
  995. </pre></td></tr>
  996. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
  997. <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
  998. Given
  999. #pragma omp parallel
  1000. #pragma omp parallel default(none)
  1001. #pragma omp taskyield
  1002. ``ompExecutableDirective()`` matches ``omp parallel``,
  1003. ``omp parallel default(none)`` and ``omp taskyield``.
  1004. </pre></td></tr>
  1005. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
  1006. <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
  1007. to reference another expressions and can be met
  1008. in BinaryConditionalOperators, for example.
  1009. Example matches 'a'
  1010. (a ?: c) + 42;
  1011. </pre></td></tr>
  1012. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
  1013. <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
  1014. Example matches (foo() + 1)
  1015. int foo() { return 1; }
  1016. int a = (foo() + 1);
  1017. </pre></td></tr>
  1018. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
  1019. <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
  1020. ParenListExprs don't have a predefined type and are used for late parsing.
  1021. In the final AST, they can be met in template declarations.
  1022. Given
  1023. template&lt;typename T&gt; class X {
  1024. void f() {
  1025. X x(*this);
  1026. int a = 0, b = 1; int i = (a, b);
  1027. }
  1028. };
  1029. parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
  1030. has a predefined type and is a ParenExpr, not a ParenListExpr.
  1031. </pre></td></tr>
  1032. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
  1033. <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
  1034. Example: Matches __func__
  1035. printf("%s", __func__);
  1036. </pre></td></tr>
  1037. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
  1038. <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
  1039. Given
  1040. return 1;
  1041. returnStmt()
  1042. matches 'return 1'
  1043. </pre></td></tr>
  1044. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
  1045. <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
  1046. Given
  1047. { ++a; }
  1048. stmt()
  1049. matches both the compound statement '{ ++a; }' and '++a'.
  1050. </pre></td></tr>
  1051. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
  1052. <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
  1053. Example match: ({ int X = 4; X; })
  1054. int C = ({ int X = 4; X; });
  1055. </pre></td></tr>
  1056. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
  1057. <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
  1058. Example matches "abcd", L"abcd"
  1059. char *s = "abcd";
  1060. wchar_t *ws = L"abcd";
  1061. </pre></td></tr>
  1062. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
  1063. <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
  1064. Given
  1065. template &lt;int N&gt;
  1066. struct A { static const int n = N; };
  1067. struct B : public A&lt;42&gt; {};
  1068. substNonTypeTemplateParmExpr()
  1069. matches "N" in the right-hand side of "static const int n = N;"
  1070. </pre></td></tr>
  1071. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
  1072. <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
  1073. Given
  1074. switch(a) { case 42: break; default: break; }
  1075. switchCase()
  1076. matches 'case 42:' and 'default:'.
  1077. </pre></td></tr>
  1078. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
  1079. <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
  1080. Given
  1081. switch(a) { case 42: break; default: break; }
  1082. switchStmt()
  1083. matches 'switch(a)'.
  1084. </pre></td></tr>
  1085. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
  1086. <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
  1087. Given
  1088. Foo x = bar;
  1089. int y = sizeof(x) + alignof(x);
  1090. unaryExprOrTypeTraitExpr()
  1091. matches sizeof(x) and alignof(x)
  1092. </pre></td></tr>
  1093. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
  1094. <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
  1095. Example matches !a
  1096. !a || b
  1097. </pre></td></tr>
  1098. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
  1099. <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
  1100. but could not be resolved to a specific declaration.
  1101. Given
  1102. template&lt;typename T&gt;
  1103. T foo() { T a; return a; }
  1104. template&lt;typename T&gt;
  1105. void bar() {
  1106. foo&lt;T&gt;();
  1107. }
  1108. unresolvedLookupExpr()
  1109. matches foo&lt;T&gt;() </pre></td></tr>
  1110. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
  1111. <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
  1112. Given
  1113. struct X {
  1114. template &lt;class T&gt; void f();
  1115. void g();
  1116. };
  1117. template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
  1118. unresolvedMemberExpr()
  1119. matches x.f&lt;T&gt;
  1120. </pre></td></tr>
  1121. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
  1122. <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
  1123. Example match: "foo"_suffix
  1124. </pre></td></tr>
  1125. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
  1126. <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
  1127. Given
  1128. while (true) {}
  1129. whileStmt()
  1130. matches 'while (true) {}'.
  1131. </pre></td></tr>
  1132. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
  1133. <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
  1134. Given
  1135. template &lt;typename T&gt; struct C {};
  1136. C&lt;int&gt; c;
  1137. templateArgument()
  1138. matches 'int' in C&lt;int&gt;.
  1139. </pre></td></tr>
  1140. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
  1141. <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
  1142. Given
  1143. template &lt;typename T&gt; class X { };
  1144. X&lt;int&gt; xi;
  1145. templateName()
  1146. matches 'X' in X&lt;int&gt;.
  1147. </pre></td></tr>
  1148. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
  1149. <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
  1150. </pre></td></tr>
  1151. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
  1152. <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
  1153. Given
  1154. int a[] = { 2, 3 };
  1155. int b[4];
  1156. void f() { int c[a[0]]; }
  1157. arrayType()
  1158. matches "int a[]", "int b[4]" and "int c[a[0]]";
  1159. </pre></td></tr>
  1160. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
  1161. <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
  1162. Given
  1163. _Atomic(int) i;
  1164. atomicType()
  1165. matches "_Atomic(int) i"
  1166. </pre></td></tr>
  1167. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
  1168. <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
  1169. Given:
  1170. auto n = 4;
  1171. int v[] = { 2, 3 }
  1172. for (auto i : v) { }
  1173. autoType()
  1174. matches "auto n" and "auto i"
  1175. </pre></td></tr>
  1176. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
  1177. <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
  1178. "void (^)(int)".
  1179. The pointee is always required to be a FunctionType.
  1180. </pre></td></tr>
  1181. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
  1182. <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
  1183. Given
  1184. struct A {};
  1185. A a;
  1186. int b;
  1187. float c;
  1188. bool d;
  1189. builtinType()
  1190. matches "int b", "float c" and "bool d"
  1191. </pre></td></tr>
  1192. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
  1193. <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
  1194. Given
  1195. _Complex float f;
  1196. complexType()
  1197. matches "_Complex float f"
  1198. </pre></td></tr>
  1199. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
  1200. <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
  1201. Given
  1202. void() {
  1203. int a[2];
  1204. int b[] = { 2, 3 };
  1205. int c[b[0]];
  1206. }
  1207. constantArrayType()
  1208. matches "int a[2]"
  1209. </pre></td></tr>
  1210. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
  1211. <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
  1212. Example matches i[] in declaration of f.
  1213. (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
  1214. Example matches i[1].
  1215. (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
  1216. void f(int i[]) {
  1217. i[1] = 0;
  1218. }
  1219. </pre></td></tr>
  1220. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
  1221. <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
  1222. Given:
  1223. short i = 1;
  1224. int j = 42;
  1225. decltype(i + j) result = i + j;
  1226. decltypeType()
  1227. matches "decltype(i + j)"
  1228. </pre></td></tr>
  1229. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
  1230. <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
  1231. Given
  1232. template&lt;typename T, int Size&gt;
  1233. class array {
  1234. T data[Size];
  1235. };
  1236. dependentSizedArrayType
  1237. matches "T data[Size]"
  1238. </pre></td></tr>
  1239. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
  1240. <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
  1241. qualified name.
  1242. Given
  1243. namespace N {
  1244. namespace M {
  1245. class D {};
  1246. }
  1247. }
  1248. class C {};
  1249. class C c;
  1250. N::M::D d;
  1251. elaboratedType() matches the type of the variable declarations of both
  1252. c and d.
  1253. </pre></td></tr>
  1254. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
  1255. <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
  1256. Given
  1257. enum C { Green };
  1258. enum class S { Red };
  1259. C c;
  1260. S s;
  1261. enumType() matches the type of the variable declarations of both c and
  1262. s.
  1263. </pre></td></tr>
  1264. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
  1265. <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
  1266. Given
  1267. int (*f)(int);
  1268. void g();
  1269. functionProtoType()
  1270. matches "int (*f)(int)" and the type of "g" in C++ mode.
  1271. In C mode, "g" is not matched because it does not contain a prototype.
  1272. </pre></td></tr>
  1273. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
  1274. <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
  1275. Given
  1276. int (*f)(int);
  1277. void g();
  1278. functionType()
  1279. matches "int (*f)(int)" and the type of "g".
  1280. </pre></td></tr>
  1281. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
  1282. <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
  1283. Given
  1284. int a[] = { 2, 3 };
  1285. int b[42];
  1286. void f(int c[]) { int d[a[0]]; };
  1287. incompleteArrayType()
  1288. matches "int a[]" and "int c[]"
  1289. </pre></td></tr>
  1290. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
  1291. <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
  1292. Example matches S s, but not S&lt;T&gt; s.
  1293. (matcher = parmVarDecl(hasType(injectedClassNameType())))
  1294. template &lt;typename T&gt; struct S {
  1295. void f(S s);
  1296. void g(S&lt;T&gt; s);
  1297. };
  1298. </pre></td></tr>
  1299. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
  1300. <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
  1301. Given:
  1302. int *a;
  1303. int &amp;b = *a;
  1304. int &amp;&amp;c = 1;
  1305. auto &amp;d = b;
  1306. auto &amp;&amp;e = c;
  1307. auto &amp;&amp;f = 2;
  1308. int g = 5;
  1309. lValueReferenceType() matches the types of b, d, and e. e is
  1310. matched since the type is deduced as int&amp; by reference collapsing rules.
  1311. </pre></td></tr>
  1312. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
  1313. <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
  1314. Given
  1315. struct A { int i; }
  1316. A::* ptr = A::i;
  1317. memberPointerType()
  1318. matches "A::* ptr"
  1319. </pre></td></tr>
  1320. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
  1321. <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
  1322. a pointer type, despite being syntactically similar.
  1323. Given
  1324. int *a;
  1325. @interface Foo
  1326. @end
  1327. Foo *f;
  1328. pointerType()
  1329. matches "Foo *f", but does not match "int *a".
  1330. </pre></td></tr>
  1331. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
  1332. <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
  1333. Given
  1334. int (*ptr_to_array)[4];
  1335. int *array_of_ptrs[4];
  1336. varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
  1337. array_of_ptrs.
  1338. </pre></td></tr>
  1339. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
  1340. <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
  1341. types.
  1342. Given
  1343. int *a;
  1344. int &amp;b = *a;
  1345. int c = 5;
  1346. @interface Foo
  1347. @end
  1348. Foo *f;
  1349. pointerType()
  1350. matches "int *a", but does not match "Foo *f".
  1351. </pre></td></tr>
  1352. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
  1353. <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
  1354. Given:
  1355. int *a;
  1356. int &amp;b = *a;
  1357. int &amp;&amp;c = 1;
  1358. auto &amp;d = b;
  1359. auto &amp;&amp;e = c;
  1360. auto &amp;&amp;f = 2;
  1361. int g = 5;
  1362. rValueReferenceType() matches the types of c and f. e is not
  1363. matched as it is deduced to int&amp; by reference collapsing rules.
  1364. </pre></td></tr>
  1365. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
  1366. <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
  1367. Given
  1368. class C {};
  1369. struct S {};
  1370. C c;
  1371. S s;
  1372. recordType() matches the type of the variable declarations of both c
  1373. and s.
  1374. </pre></td></tr>
  1375. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
  1376. <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
  1377. Given
  1378. int *a;
  1379. int &amp;b = *a;
  1380. int &amp;&amp;c = 1;
  1381. auto &amp;d = b;
  1382. auto &amp;&amp;e = c;
  1383. auto &amp;&amp;f = 2;
  1384. int g = 5;
  1385. referenceType() matches the types of b, c, d, e, and f.
  1386. </pre></td></tr>
  1387. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
  1388. <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
  1389. template type parameter.
  1390. Given
  1391. template &lt;typename T&gt;
  1392. void F(T t) {
  1393. int i = 1 + t;
  1394. }
  1395. substTemplateTypeParmType() matches the type of 't' but not '1'
  1396. </pre></td></tr>
  1397. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
  1398. <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
  1399. Given
  1400. enum E {};
  1401. class C {};
  1402. E e;
  1403. C c;
  1404. tagType() matches the type of the variable declarations of both e
  1405. and c.
  1406. </pre></td></tr>
  1407. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
  1408. <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
  1409. Given
  1410. template &lt;typename T&gt;
  1411. class C { };
  1412. template class C&lt;int&gt;; // A
  1413. C&lt;char&gt; var; // B
  1414. templateSpecializationType() matches the type of the explicit
  1415. instantiation in A and the type of the variable declaration in B.
  1416. </pre></td></tr>
  1417. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
  1418. <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
  1419. Example matches T, but not int.
  1420. (matcher = templateTypeParmType())
  1421. template &lt;typename T&gt; void f(int i);
  1422. </pre></td></tr>
  1423. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
  1424. <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
  1425. </pre></td></tr>
  1426. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
  1427. <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
  1428. Given
  1429. typedef int X;
  1430. typedefType()
  1431. matches "typedef int X"
  1432. </pre></td></tr>
  1433. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
  1434. <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
  1435. Given:
  1436. typedef __underlying_type(T) type;
  1437. unaryTransformType()
  1438. matches "__underlying_type(T)"
  1439. </pre></td></tr>
  1440. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
  1441. <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
  1442. integer-constant-expression.
  1443. Given
  1444. void f() {
  1445. int a[] = { 2, 3 }
  1446. int b[42];
  1447. int c[a[0]];
  1448. }
  1449. variableArrayType()
  1450. matches "int c[a[0]]"
  1451. </pre></td></tr>
  1452. <!--END_DECL_MATCHERS -->
  1453. </table>
  1454. <!-- ======================================================================= -->
  1455. <h2 id="narrowing-matchers">Narrowing Matchers</h2>
  1456. <!-- ======================================================================= -->
  1457. <p>Narrowing matchers match certain attributes on the current node, thus
  1458. narrowing down the set of nodes of the current type to match on.</p>
  1459. <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
  1460. which allow users to create more powerful match expressions.</p>
  1461. <table>
  1462. <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
  1463. <!-- START_NARROWING_MATCHERS -->
  1464. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
  1465. <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
  1466. Usable as: Any Matcher
  1467. </pre></td></tr>
  1468. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
  1469. <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
  1470. Usable as: Any Matcher
  1471. </pre></td></tr>
  1472. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
  1473. <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
  1474. Useful when another matcher requires a child matcher, but there's no
  1475. additional constraint. This will often be used with an explicit conversion
  1476. to an internal::Matcher&lt;&gt; type such as TypeMatcher.
  1477. Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
  1478. "int* p" and "void f()" in
  1479. int* p;
  1480. void f();
  1481. Usable as: Any Matcher
  1482. </pre></td></tr>
  1483. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
  1484. <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
  1485. Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
  1486. class X {};
  1487. class Y {};
  1488. Usable as: Any Matcher
  1489. </pre></td></tr>
  1490. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
  1491. <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
  1492. unary).
  1493. Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
  1494. !(a || b)
  1495. </pre></td></tr>
  1496. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
  1497. <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
  1498. Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
  1499. if (a == b)
  1500. a += b;
  1501. Example 2: matches s1 = s2
  1502. (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
  1503. struct S { S&amp; operator=(const S&amp;); };
  1504. void x() { S s1, s2; s1 = s2; })
  1505. </pre></td></tr>
  1506. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
  1507. <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
  1508. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr>
  1509. <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
  1510. Given
  1511. f('false, 3.14, 42);
  1512. characterLiteral(equals(0))
  1513. matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
  1514. match false
  1515. floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
  1516. match 3.14
  1517. integerLiteral(equals(42))
  1518. matches 42
  1519. Note that you cannot directly match a negative numeric literal because the
  1520. minus sign is not part of the literal: It is a unary operator whose operand
  1521. is the positive numeric literal. Instead, you must use a unaryOperator()
  1522. matcher to match the minus sign:
  1523. unaryOperator(hasOperatorName("-"),
  1524. hasUnaryOperand(integerLiteral(equals(13))))
  1525. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
  1526. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
  1527. </pre></td></tr>
  1528. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
  1529. <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
  1530. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
  1531. <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
  1532. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
  1533. <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
  1534. Given
  1535. try {
  1536. // ...
  1537. } catch (int) {
  1538. // ...
  1539. } catch (...) {
  1540. // ...
  1541. }
  1542. cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
  1543. </pre></td></tr>
  1544. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
  1545. <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
  1546. a specific number of arguments (including absent default arguments).
  1547. Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
  1548. void f(int x, int y);
  1549. f(0, 0);
  1550. </pre></td></tr>
  1551. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
  1552. <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
  1553. </pre></td></tr>
  1554. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
  1555. <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
  1556. zero initialization.
  1557. Given
  1558. void foo() {
  1559. struct point { double x; double y; };
  1560. point pt[2] = { { 1.0, 2.0 } };
  1561. }
  1562. initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
  1563. will match the implicit array filler for pt[1].
  1564. </pre></td></tr>
  1565. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
  1566. <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
  1567. Given
  1568. struct S {
  1569. S(); // #1
  1570. S(const S &amp;); // #2
  1571. S(S &amp;&amp;); // #3
  1572. };
  1573. cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
  1574. </pre></td></tr>
  1575. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
  1576. <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
  1577. Given
  1578. struct S {
  1579. S(); // #1
  1580. S(const S &amp;); // #2
  1581. S(S &amp;&amp;); // #3
  1582. };
  1583. cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
  1584. </pre></td></tr>
  1585. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
  1586. <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
  1587. Given
  1588. struct S {
  1589. S(); // #1
  1590. S(int) {} // #2
  1591. S(S &amp;&amp;) : S() {} // #3
  1592. };
  1593. S::S() : S(0) {} // #4
  1594. cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
  1595. #1 or #2.
  1596. </pre></td></tr>
  1597. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
  1598. <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
  1599. that have an explicit specifier if this explicit specifier is resolved to
  1600. true.
  1601. Given
  1602. template&lt;bool b&gt;
  1603. struct S {
  1604. S(int); // #1
  1605. explicit S(double); // #2
  1606. operator int(); // #3
  1607. explicit operator bool(); // #4
  1608. explicit(false) S(bool) // # 7
  1609. explicit(true) S(char) // # 8
  1610. explicit(b) S(S) // # 9
  1611. };
  1612. S(int) -&gt; S&lt;true&gt; // #5
  1613. explicit S(double) -&gt; S&lt;false&gt; // #6
  1614. cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
  1615. cxxConversionDecl(isExplicit()) will match #4, but not #3.
  1616. cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
  1617. </pre></td></tr>
  1618. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
  1619. <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
  1620. Given
  1621. struct S {
  1622. S(); // #1
  1623. S(const S &amp;); // #2
  1624. S(S &amp;&amp;); // #3
  1625. };
  1626. cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
  1627. </pre></td></tr>
  1628. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
  1629. <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
  1630. that have an explicit specifier if this explicit specifier is resolved to
  1631. true.
  1632. Given
  1633. template&lt;bool b&gt;
  1634. struct S {
  1635. S(int); // #1
  1636. explicit S(double); // #2
  1637. operator int(); // #3
  1638. explicit operator bool(); // #4
  1639. explicit(false) S(bool) // # 7
  1640. explicit(true) S(char) // # 8
  1641. explicit(b) S(S) // # 9
  1642. };
  1643. S(int) -&gt; S&lt;true&gt; // #5
  1644. explicit S(double) -&gt; S&lt;false&gt; // #6
  1645. cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
  1646. cxxConversionDecl(isExplicit()) will match #4, but not #3.
  1647. cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
  1648. </pre></td></tr>
  1649. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
  1650. <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
  1651. opposed to a member.
  1652. Given
  1653. struct B {};
  1654. struct D : B {
  1655. int I;
  1656. D(int i) : I(i) {}
  1657. };
  1658. struct E : B {
  1659. E() : B() {}
  1660. };
  1661. cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
  1662. will match E(), but not match D(int).
  1663. </pre></td></tr>
  1664. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
  1665. <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
  1666. opposed to a base.
  1667. Given
  1668. struct B {};
  1669. struct D : B {
  1670. int I;
  1671. D(int i) : I(i) {}
  1672. };
  1673. struct E : B {
  1674. E() : B() {}
  1675. };
  1676. cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
  1677. will match D(int), but not match E().
  1678. </pre></td></tr>
  1679. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
  1680. <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
  1681. code (as opposed to implicitly added by the compiler).
  1682. Given
  1683. struct Foo {
  1684. Foo() { }
  1685. Foo(int) : foo_("A") { }
  1686. string foo_;
  1687. };
  1688. cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
  1689. will match Foo(int), but not Foo()
  1690. </pre></td></tr>
  1691. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
  1692. <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
  1693. that have an explicit specifier if this explicit specifier is resolved to
  1694. true.
  1695. Given
  1696. template&lt;bool b&gt;
  1697. struct S {
  1698. S(int); // #1
  1699. explicit S(double); // #2
  1700. operator int(); // #3
  1701. explicit operator bool(); // #4
  1702. explicit(false) S(bool) // # 7
  1703. explicit(true) S(char) // # 8
  1704. explicit(b) S(S) // # 9
  1705. };
  1706. S(int) -&gt; S&lt;true&gt; // #5
  1707. explicit S(double) -&gt; S&lt;false&gt; // #6
  1708. cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
  1709. cxxConversionDecl(isExplicit()) will match #4, but not #3.
  1710. cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
  1711. </pre></td></tr>
  1712. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
  1713. <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
  1714. to '.'.
  1715. Member calls on the implicit this pointer match as called with '-&gt;'.
  1716. Given
  1717. class Y {
  1718. void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
  1719. template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
  1720. int a;
  1721. static int b;
  1722. };
  1723. template &lt;class T&gt;
  1724. class Z {
  1725. void x() { this-&gt;m; }
  1726. };
  1727. memberExpr(isArrow())
  1728. matches this-&gt;x, x, y.x, a, this-&gt;b
  1729. cxxDependentScopeMemberExpr(isArrow())
  1730. matches this-&gt;m
  1731. unresolvedMemberExpr(isArrow())
  1732. matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
  1733. </pre></td></tr>
  1734. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
  1735. <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
  1736. Given
  1737. struct A {
  1738. void foo() const;
  1739. void bar();
  1740. };
  1741. cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
  1742. </pre></td></tr>
  1743. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
  1744. <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
  1745. operator.
  1746. Given
  1747. struct A {
  1748. A &amp;operator=(const A &amp;);
  1749. A &amp;operator=(A &amp;&amp;);
  1750. };
  1751. cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
  1752. the second one.
  1753. </pre></td></tr>
  1754. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
  1755. <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
  1756. Given:
  1757. class A final {};
  1758. struct B {
  1759. virtual void f();
  1760. };
  1761. struct C : B {
  1762. void f() final;
  1763. };
  1764. matches A and C::f, but not B, C, or B::f
  1765. </pre></td></tr>
  1766. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
  1767. <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
  1768. operator.
  1769. Given
  1770. struct A {
  1771. A &amp;operator=(const A &amp;);
  1772. A &amp;operator=(A &amp;&amp;);
  1773. };
  1774. cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
  1775. the first one.
  1776. </pre></td></tr>
  1777. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
  1778. <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
  1779. Given
  1780. class A {
  1781. public:
  1782. virtual void x();
  1783. };
  1784. class B : public A {
  1785. public:
  1786. virtual void x();
  1787. };
  1788. matches B::x
  1789. </pre></td></tr>
  1790. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
  1791. <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
  1792. Given
  1793. class A {
  1794. public:
  1795. virtual void x() = 0;
  1796. };
  1797. matches A::x
  1798. </pre></td></tr>
  1799. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
  1800. <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
  1801. Given
  1802. struct S {
  1803. S(); // #1
  1804. S(const S &amp;) = default; // #2
  1805. S(S &amp;&amp;) = delete; // #3
  1806. };
  1807. cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
  1808. </pre></td></tr>
  1809. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
  1810. <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
  1811. Given
  1812. class A {
  1813. public:
  1814. virtual void x();
  1815. };
  1816. matches A::x
  1817. </pre></td></tr>
  1818. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
  1819. <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
  1820. Given
  1821. class A {
  1822. public:
  1823. virtual void x();
  1824. };
  1825. class B : public A {
  1826. public:
  1827. void x();
  1828. };
  1829. matches A::x but not B::x
  1830. </pre></td></tr>
  1831. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
  1832. <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
  1833. Given:
  1834. MyClass *p1 = new MyClass[10];
  1835. cxxNewExpr(isArray())
  1836. matches the expression 'new MyClass[10]'.
  1837. </pre></td></tr>
  1838. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
  1839. <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
  1840. Matches overloaded operator names specified in strings without the
  1841. "operator" prefix: e.g. "&lt;&lt;".
  1842. Given:
  1843. class A { int operator*(); };
  1844. const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
  1845. A a;
  1846. a &lt;&lt; a; // &lt;-- This matches
  1847. cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
  1848. specified line and
  1849. cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
  1850. matches the declaration of A.
  1851. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
  1852. </pre></td></tr>
  1853. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
  1854. <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
  1855. Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
  1856. if (a == b)
  1857. a += b;
  1858. Example 2: matches s1 = s2
  1859. (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
  1860. struct S { S&amp; operator=(const S&amp;); };
  1861. void x() { S s1, s2; s1 = s2; })
  1862. </pre></td></tr>
  1863. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
  1864. <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
  1865. Example matches x (matcher = cxxRecordDecl(hasDefinition()))
  1866. class x {};
  1867. class y;
  1868. </pre></td></tr>
  1869. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
  1870. <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
  1871. </pre></td></tr>
  1872. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
  1873. <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
  1874. </pre></td></tr>
  1875. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
  1876. <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
  1877. static member variable template instantiations.
  1878. Given
  1879. template&lt;typename T&gt; void A(T t) { }
  1880. template&lt;&gt; void A(int N) { }
  1881. functionDecl(isExplicitTemplateSpecialization())
  1882. matches the specialization A&lt;int&gt;().
  1883. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  1884. </pre></td></tr>
  1885. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
  1886. <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
  1887. Given:
  1888. class A final {};
  1889. struct B {
  1890. virtual void f();
  1891. };
  1892. struct C : B {
  1893. void f() final;
  1894. };
  1895. matches A and C::f, but not B, C, or B::f
  1896. </pre></td></tr>
  1897. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
  1898. <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
  1899. Given:
  1900. auto x = []{};
  1901. cxxRecordDecl(isLambda()) matches the implicit class declaration of
  1902. decltype(x)
  1903. </pre></td></tr>
  1904. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
  1905. <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
  1906. isSameOrDerivedFrom(hasName(...)).
  1907. </pre></td></tr>
  1908. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
  1909. <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
  1910. member variable template instantiations.
  1911. Given
  1912. template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
  1913. or
  1914. template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
  1915. or
  1916. template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
  1917. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  1918. matches the template instantiation of X&lt;A&gt;.
  1919. But given
  1920. template &lt;typename T&gt; class X {}; class A {};
  1921. template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
  1922. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  1923. does not match, as X&lt;A&gt; is an explicit template specialization.
  1924. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  1925. </pre></td></tr>
  1926. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
  1927. <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
  1928. a specific number of arguments (including absent default arguments).
  1929. Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
  1930. void f(int x, int y);
  1931. f(0, 0);
  1932. </pre></td></tr>
  1933. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
  1934. <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
  1935. Example matches y(x) but not y(42) or NS::y(x).
  1936. namespace NS {
  1937. struct X {};
  1938. void y(X);
  1939. }
  1940. void y(...);
  1941. void test() {
  1942. NS::X x;
  1943. y(x); // Matches
  1944. NS::y(x); // Doesn't match
  1945. y(42); // Doesn't match
  1946. using NS::y;
  1947. y(x); // Found by both unqualified lookup and ADL, doesn't match
  1948. }
  1949. </pre></td></tr>
  1950. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
  1951. <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
  1952. Example: matches the implicit cast around 0
  1953. (matcher = castExpr(hasCastKind(CK_NullToPointer)))
  1954. int *p = 0;
  1955. If the matcher is use from clang-query, CastKind parameter
  1956. should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
  1957. </pre></td></tr>
  1958. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
  1959. <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
  1960. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr>
  1961. <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
  1962. Given
  1963. f('false, 3.14, 42);
  1964. characterLiteral(equals(0))
  1965. matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
  1966. match false
  1967. floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
  1968. match 3.14
  1969. integerLiteral(equals(42))
  1970. matches 42
  1971. Note that you cannot directly match a negative numeric literal because the
  1972. minus sign is not part of the literal: It is a unary operator whose operand
  1973. is the positive numeric literal. Instead, you must use a unaryOperator()
  1974. matcher to match the minus sign:
  1975. unaryOperator(hasOperatorName("-"),
  1976. hasUnaryOperand(integerLiteral(equals(13))))
  1977. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
  1978. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
  1979. </pre></td></tr>
  1980. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
  1981. <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
  1982. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
  1983. <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
  1984. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
  1985. <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
  1986. Given
  1987. template&lt;typename T&gt; struct C {};
  1988. C&lt;int&gt; c;
  1989. classTemplateSpecializationDecl(templateArgumentCountIs(1))
  1990. matches C&lt;int&gt;.
  1991. </pre></td></tr>
  1992. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
  1993. <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
  1994. child statements.
  1995. Example: Given
  1996. { for (;;) {} }
  1997. compoundStmt(statementCountIs(0)))
  1998. matches '{}'
  1999. but does not match the outer compound statement.
  2000. </pre></td></tr>
  2001. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
  2002. <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
  2003. Given
  2004. int a[42];
  2005. int b[2 * 21];
  2006. int c[41], d[43];
  2007. char *s = "abcd";
  2008. wchar_t *ws = L"abcd";
  2009. char *w = "a";
  2010. constantArrayType(hasSize(42))
  2011. matches "int a[42]" and "int b[2 * 21]"
  2012. stringLiteral(hasSize(4))
  2013. matches "abcd", L"abcd"
  2014. </pre></td></tr>
  2015. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
  2016. <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
  2017. declarations.
  2018. Example: Given
  2019. int a, b;
  2020. int c;
  2021. int d = 2, e;
  2022. declCountIs(2)
  2023. matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
  2024. </pre></td></tr>
  2025. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
  2026. <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
  2027. Matches a node if it equals the node previously bound to ID.
  2028. Given
  2029. class X { int a; int b; };
  2030. cxxRecordDecl(
  2031. has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
  2032. has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
  2033. matches the class X, as a and b have the same type.
  2034. Note that when multiple matches are involved via forEach* matchers,
  2035. equalsBoundNodes acts as a filter.
  2036. For example:
  2037. compoundStmt(
  2038. forEachDescendant(varDecl().bind("d")),
  2039. forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
  2040. will trigger a match for each combination of variable declaration
  2041. and reference to that variable declaration within a compound statement.
  2042. </pre></td></tr>
  2043. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
  2044. <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
  2045. Decl has pointer identity in the AST.
  2046. </pre></td></tr>
  2047. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
  2048. <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
  2049. Given
  2050. __attribute__((device)) void f() { ... }
  2051. decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
  2052. f. If the matcher is used from clang-query, attr::Kind parameter should be
  2053. passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
  2054. </pre></td></tr>
  2055. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
  2056. <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
  2057. partially matching a given regex.
  2058. Example matches Y but not X
  2059. (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
  2060. #include "ASTMatcher.h"
  2061. class X {};
  2062. ASTMatcher.h:
  2063. class Y {};
  2064. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2065. </pre></td></tr>
  2066. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
  2067. <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
  2068. Example matches X but not Y
  2069. (matcher = cxxRecordDecl(isExpansionInMainFile())
  2070. #include &lt;Y.h&gt;
  2071. class X {};
  2072. Y.h:
  2073. class Y {};
  2074. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2075. </pre></td></tr>
  2076. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
  2077. <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
  2078. Example matches Y but not X
  2079. (matcher = cxxRecordDecl(isExpansionInSystemHeader())
  2080. #include &lt;SystemHeader.h&gt;
  2081. class X {};
  2082. SystemHeader.h:
  2083. class Y {};
  2084. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2085. </pre></td></tr>
  2086. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
  2087. <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
  2088. by the compiler (eg. implicit default/copy constructors).
  2089. </pre></td></tr>
  2090. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
  2091. <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
  2092. Given
  2093. class vector {};
  2094. namespace foo {
  2095. class vector {};
  2096. namespace std {
  2097. class vector {};
  2098. }
  2099. }
  2100. namespace std {
  2101. inline namespace __1 {
  2102. class vector {}; // #1
  2103. namespace experimental {
  2104. class vector {};
  2105. }
  2106. }
  2107. }
  2108. cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
  2109. </pre></td></tr>
  2110. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
  2111. <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
  2112. Given
  2113. class C {
  2114. public: int a;
  2115. protected: int b;
  2116. private: int c;
  2117. };
  2118. fieldDecl(isPrivate())
  2119. matches 'int c;'
  2120. </pre></td></tr>
  2121. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
  2122. <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
  2123. Given
  2124. class C {
  2125. public: int a;
  2126. protected: int b;
  2127. private: int c;
  2128. };
  2129. fieldDecl(isProtected())
  2130. matches 'int b;'
  2131. </pre></td></tr>
  2132. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
  2133. <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
  2134. Given
  2135. class C {
  2136. public: int a;
  2137. protected: int b;
  2138. private: int c;
  2139. };
  2140. fieldDecl(isPublic())
  2141. matches 'int a;'
  2142. </pre></td></tr>
  2143. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
  2144. <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
  2145. a specific number of designators.
  2146. Example: Given
  2147. point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
  2148. point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
  2149. designatorCountIs(2)
  2150. matches '{ [2].y = 1.0, [0].x = 1.0 }',
  2151. but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
  2152. </pre></td></tr>
  2153. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
  2154. <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
  2155. Example matches Y (matcher = enumDecl(isScoped()))
  2156. enum X {};
  2157. enum class Y {};
  2158. </pre></td></tr>
  2159. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
  2160. <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
  2161. neither type- nor value-dependent.
  2162. In the following example, the expression sizeof(sizeof(T() + T()))
  2163. is instantiation-dependent (since it involves a template parameter T),
  2164. but is neither type- nor value-dependent, since the type of the inner
  2165. sizeof is known (std::size_t) and therefore the size of the outer
  2166. sizeof is known.
  2167. template&lt;typename T&gt;
  2168. void f(T x, T y) { sizeof(sizeof(T() + T()); }
  2169. expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
  2170. </pre></td></tr>
  2171. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
  2172. <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
  2173. is not yet instantiated.
  2174. For example, the expressions "x" and "x + y" are type-dependent in
  2175. the following code, but "y" is not type-dependent:
  2176. template&lt;typename T&gt;
  2177. void add(T x, int y) {
  2178. x + y;
  2179. }
  2180. expr(isTypeDependent()) matches x + y
  2181. </pre></td></tr>
  2182. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
  2183. <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
  2184. non-type template parameter.
  2185. For example, the array bound of "Chars" in the following example is
  2186. value-dependent.
  2187. template&lt;int Size&gt; int f() { return Size; }
  2188. expr(isValueDependent()) matches return Size
  2189. </pre></td></tr>
  2190. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
  2191. <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
  2192. bit width.
  2193. Given
  2194. class C {
  2195. int a : 2;
  2196. int b : 4;
  2197. int c : 2;
  2198. };
  2199. fieldDecl(hasBitWidth(2))
  2200. matches 'int a;' and 'int c;' but not 'int b;'.
  2201. </pre></td></tr>
  2202. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
  2203. <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
  2204. Given
  2205. class C {
  2206. int a : 2;
  2207. int b;
  2208. };
  2209. fieldDecl(isBitField())
  2210. matches 'int a;' but not 'int b;'.
  2211. </pre></td></tr>
  2212. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr>
  2213. <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
  2214. Given
  2215. f('false, 3.14, 42);
  2216. characterLiteral(equals(0))
  2217. matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
  2218. match false
  2219. floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
  2220. match 3.14
  2221. integerLiteral(equals(42))
  2222. matches 42
  2223. Note that you cannot directly match a negative numeric literal because the
  2224. minus sign is not part of the literal: It is a unary operator whose operand
  2225. is the positive numeric literal. Instead, you must use a unaryOperator()
  2226. matcher to match the minus sign:
  2227. unaryOperator(hasOperatorName("-"),
  2228. hasUnaryOperand(integerLiteral(equals(13))))
  2229. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
  2230. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
  2231. </pre></td></tr>
  2232. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
  2233. <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
  2234. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
  2235. <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
  2236. Given:
  2237. void f();
  2238. void g() noexcept;
  2239. void h() noexcept(true);
  2240. void i() noexcept(false);
  2241. void j() throw();
  2242. void k() throw(int);
  2243. void l() throw(...);
  2244. functionDecl(hasDynamicExceptionSpec()) and
  2245. functionProtoType(hasDynamicExceptionSpec())
  2246. match the declarations of j, k, and l, but not f, g, h, or i.
  2247. </pre></td></tr>
  2248. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
  2249. <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
  2250. Matches overloaded operator names specified in strings without the
  2251. "operator" prefix: e.g. "&lt;&lt;".
  2252. Given:
  2253. class A { int operator*(); };
  2254. const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
  2255. A a;
  2256. a &lt;&lt; a; // &lt;-- This matches
  2257. cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
  2258. specified line and
  2259. cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
  2260. matches the declaration of A.
  2261. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
  2262. </pre></td></tr>
  2263. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
  2264. <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
  2265. Example matches Y (matcher = functionDecl(hasTrailingReturn()))
  2266. int X() {}
  2267. auto Y() -&gt; int {}
  2268. </pre></td></tr>
  2269. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
  2270. <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
  2271. and if constexpr.
  2272. Given:
  2273. constexpr int foo = 42;
  2274. constexpr int bar();
  2275. void baz() { if constexpr(1 &gt; 0) {} }
  2276. varDecl(isConstexpr())
  2277. matches the declaration of foo.
  2278. functionDecl(isConstexpr())
  2279. matches the declaration of bar.
  2280. ifStmt(isConstexpr())
  2281. matches the if statement in baz.
  2282. </pre></td></tr>
  2283. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
  2284. <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
  2285. Given:
  2286. class A { ~A(); };
  2287. class B { ~B() = default; };
  2288. functionDecl(isDefaulted())
  2289. matches the declaration of ~B, but not ~A.
  2290. </pre></td></tr>
  2291. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
  2292. <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
  2293. Example matches A, va, fa
  2294. class A {};
  2295. class B; // Doesn't match, as it has no body.
  2296. int va;
  2297. extern int vb; // Doesn't match, as it doesn't define the variable.
  2298. void fa() {}
  2299. void fb(); // Doesn't match, as it has no body.
  2300. @interface X
  2301. - (void)ma; // Doesn't match, interface is declaration.
  2302. @end
  2303. @implementation X
  2304. - (void)ma {}
  2305. @end
  2306. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
  2307. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
  2308. </pre></td></tr>
  2309. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
  2310. <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
  2311. Given:
  2312. void Func();
  2313. void DeletedFunc() = delete;
  2314. functionDecl(isDeleted())
  2315. matches the declaration of DeletedFunc, but not Func.
  2316. </pre></td></tr>
  2317. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
  2318. <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
  2319. static member variable template instantiations.
  2320. Given
  2321. template&lt;typename T&gt; void A(T t) { }
  2322. template&lt;&gt; void A(int N) { }
  2323. functionDecl(isExplicitTemplateSpecialization())
  2324. matches the specialization A&lt;int&gt;().
  2325. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  2326. </pre></td></tr>
  2327. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
  2328. <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
  2329. Given:
  2330. extern "C" void f() {}
  2331. extern "C" { void g() {} }
  2332. void h() {}
  2333. extern "C" int x = 1;
  2334. extern "C" int y = 2;
  2335. int z = 3;
  2336. functionDecl(isExternC())
  2337. matches the declaration of f and g, but not the declaration of h.
  2338. varDecl(isExternC())
  2339. matches the declaration of x and y, but not the declaration of z.
  2340. </pre></td></tr>
  2341. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
  2342. <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
  2343. the inline keyword.
  2344. Given
  2345. inline void f();
  2346. void g();
  2347. namespace n {
  2348. inline namespace m {}
  2349. }
  2350. functionDecl(isInline()) will match ::f().
  2351. namespaceDecl(isInline()) will match n::m.
  2352. </pre></td></tr>
  2353. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
  2354. <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
  2355. into an executable program.
  2356. </pre></td></tr>
  2357. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
  2358. <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
  2359. Given
  2360. void nope();
  2361. [[noreturn]] void a();
  2362. __attribute__((noreturn)) void b();
  2363. struct c { [[noreturn]] c(); };
  2364. functionDecl(isNoReturn())
  2365. matches all of those except
  2366. void nope();
  2367. </pre></td></tr>
  2368. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
  2369. <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
  2370. Given:
  2371. void f();
  2372. void g() noexcept;
  2373. void h() throw();
  2374. void i() throw(int);
  2375. void j() noexcept(false);
  2376. functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
  2377. match the declarations of g, and h, but not f, i or j.
  2378. </pre></td></tr>
  2379. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
  2380. <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
  2381. class specifier ("static" keyword) written in the source.
  2382. Given:
  2383. static void f() {}
  2384. static int i = 0;
  2385. extern int j;
  2386. int k;
  2387. functionDecl(isStaticStorageClass())
  2388. matches the function declaration f.
  2389. varDecl(isStaticStorageClass())
  2390. matches the variable declaration i.
  2391. </pre></td></tr>
  2392. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
  2393. <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
  2394. member variable template instantiations.
  2395. Given
  2396. template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
  2397. or
  2398. template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
  2399. or
  2400. template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
  2401. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  2402. matches the template instantiation of X&lt;A&gt;.
  2403. But given
  2404. template &lt;typename T&gt; class X {}; class A {};
  2405. template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
  2406. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  2407. does not match, as X&lt;A&gt; is an explicit template specialization.
  2408. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  2409. </pre></td></tr>
  2410. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
  2411. <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
  2412. Example matches f, but not g or h. The function i will not match, even when
  2413. compiled in C mode.
  2414. void f(...);
  2415. void g(int);
  2416. template &lt;typename... Ts&gt; void h(Ts...);
  2417. void i();
  2418. </pre></td></tr>
  2419. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
  2420. <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
  2421. specific parameter count.
  2422. Given
  2423. void f(int i) {}
  2424. void g(int i, int j) {}
  2425. void h(int i, int j);
  2426. void j(int i);
  2427. void k(int x, int y, int z, ...);
  2428. functionDecl(parameterCountIs(2))
  2429. matches g and h
  2430. functionProtoType(parameterCountIs(2))
  2431. matches g and h
  2432. functionProtoType(parameterCountIs(3))
  2433. matches k
  2434. </pre></td></tr>
  2435. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
  2436. <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
  2437. Given:
  2438. void f();
  2439. void g() noexcept;
  2440. void h() noexcept(true);
  2441. void i() noexcept(false);
  2442. void j() throw();
  2443. void k() throw(int);
  2444. void l() throw(...);
  2445. functionDecl(hasDynamicExceptionSpec()) and
  2446. functionProtoType(hasDynamicExceptionSpec())
  2447. match the declarations of j, k, and l, but not f, g, h, or i.
  2448. </pre></td></tr>
  2449. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
  2450. <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
  2451. Given:
  2452. void f();
  2453. void g() noexcept;
  2454. void h() throw();
  2455. void i() throw(int);
  2456. void j() noexcept(false);
  2457. functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
  2458. match the declarations of g, and h, but not f, i or j.
  2459. </pre></td></tr>
  2460. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
  2461. <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
  2462. specific parameter count.
  2463. Given
  2464. void f(int i) {}
  2465. void g(int i, int j) {}
  2466. void h(int i, int j);
  2467. void j(int i);
  2468. void k(int x, int y, int z, ...);
  2469. functionDecl(parameterCountIs(2))
  2470. matches g and h
  2471. functionProtoType(parameterCountIs(2))
  2472. matches g and h
  2473. functionProtoType(parameterCountIs(3))
  2474. matches k
  2475. </pre></td></tr>
  2476. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
  2477. <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
  2478. and if constexpr.
  2479. Given:
  2480. constexpr int foo = 42;
  2481. constexpr int bar();
  2482. void baz() { if constexpr(1 &gt; 0) {} }
  2483. varDecl(isConstexpr())
  2484. matches the declaration of foo.
  2485. functionDecl(isConstexpr())
  2486. matches the declaration of bar.
  2487. ifStmt(isConstexpr())
  2488. matches the if statement in baz.
  2489. </pre></td></tr>
  2490. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
  2491. <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
  2492. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr>
  2493. <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
  2494. Given
  2495. f('false, 3.14, 42);
  2496. characterLiteral(equals(0))
  2497. matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
  2498. match false
  2499. floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
  2500. match 3.14
  2501. integerLiteral(equals(42))
  2502. matches 42
  2503. Note that you cannot directly match a negative numeric literal because the
  2504. minus sign is not part of the literal: It is a unary operator whose operand
  2505. is the positive numeric literal. Instead, you must use a unaryOperator()
  2506. matcher to match the minus sign:
  2507. unaryOperator(hasOperatorName("-"),
  2508. hasUnaryOperand(integerLiteral(equals(13))))
  2509. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
  2510. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
  2511. </pre></td></tr>
  2512. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
  2513. <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
  2514. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
  2515. <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
  2516. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
  2517. <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
  2518. to '.'.
  2519. Member calls on the implicit this pointer match as called with '-&gt;'.
  2520. Given
  2521. class Y {
  2522. void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
  2523. template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
  2524. int a;
  2525. static int b;
  2526. };
  2527. template &lt;class T&gt;
  2528. class Z {
  2529. void x() { this-&gt;m; }
  2530. };
  2531. memberExpr(isArrow())
  2532. matches this-&gt;x, x, y.x, a, this-&gt;b
  2533. cxxDependentScopeMemberExpr(isArrow())
  2534. matches this-&gt;m
  2535. unresolvedMemberExpr(isArrow())
  2536. matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
  2537. </pre></td></tr>
  2538. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
  2539. <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
  2540. Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
  2541. void f() {
  2542. int x;
  2543. static int y;
  2544. }
  2545. int z;
  2546. Example matches f() because it has external formal linkage despite being
  2547. unique to the translation unit as though it has internal likage
  2548. (matcher = functionDecl(hasExternalFormalLinkage()))
  2549. namespace {
  2550. void f() {}
  2551. }
  2552. </pre></td></tr>
  2553. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string Name</td></tr>
  2554. <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
  2555. Supports specifying enclosing namespaces or classes by prefixing the name
  2556. with '&lt;enclosing&gt;::'.
  2557. Does not match typedefs of an underlying type with the given name.
  2558. Example matches X (Name == "X")
  2559. class X;
  2560. Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
  2561. namespace a { namespace b { class X; } }
  2562. </pre></td></tr>
  2563. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
  2564. <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
  2565. a substring matched by the given RegExp.
  2566. Supports specifying enclosing namespaces or classes by
  2567. prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
  2568. of an underlying type with the given name.
  2569. Example matches X (regexp == "::X")
  2570. class X;
  2571. Example matches X (regexp is one of "::X", "^foo::.*X", among others)
  2572. namespace foo { namespace bar { class X; } }
  2573. </pre></td></tr>
  2574. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
  2575. <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
  2576. Given
  2577. namespace n {
  2578. namespace {} // #1
  2579. }
  2580. namespaceDecl(isAnonymous()) will match #1 but not ::n.
  2581. </pre></td></tr>
  2582. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
  2583. <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
  2584. the inline keyword.
  2585. Given
  2586. inline void f();
  2587. void g();
  2588. namespace n {
  2589. inline namespace m {}
  2590. }
  2591. functionDecl(isInline()) will match ::f().
  2592. namespaceDecl(isInline()) will match n::m.
  2593. </pre></td></tr>
  2594. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
  2595. <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
  2596. Given
  2597. #pragma omp parallel
  2598. #pragma omp parallel default(none)
  2599. #pragma omp parallel default(shared)
  2600. ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
  2601. </pre></td></tr>
  2602. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
  2603. <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
  2604. Given
  2605. #pragma omp parallel
  2606. #pragma omp parallel default(none)
  2607. #pragma omp parallel default(shared)
  2608. ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
  2609. </pre></td></tr>
  2610. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
  2611. <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
  2612. clause kind.
  2613. Given
  2614. #pragma omp parallel
  2615. #pragma omp parallel for
  2616. #pragma omp for
  2617. `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
  2618. ``omp parallel`` and ``omp parallel for``.
  2619. If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
  2620. should be passed as a quoted string. e.g.,
  2621. ``isAllowedToContainClauseKind("OMPC_default").``
  2622. </pre></td></tr>
  2623. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
  2624. <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
  2625. i.e., directives that can't have a structured block.
  2626. Given
  2627. #pragma omp parallel
  2628. {}
  2629. #pragma omp taskyield
  2630. ``ompExecutableDirective(isStandaloneDirective()))`` matches
  2631. ``omp taskyield``.
  2632. </pre></td></tr>
  2633. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
  2634. <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
  2635. </pre></td></tr>
  2636. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
  2637. <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
  2638. </pre></td></tr>
  2639. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
  2640. <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
  2641. isSameOrDerivedFrom(hasName(...)).
  2642. </pre></td></tr>
  2643. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
  2644. <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
  2645. a specific number of arguments (including absent default arguments).
  2646. Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
  2647. void f(int x, int y);
  2648. f(0, 0);
  2649. </pre></td></tr>
  2650. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
  2651. <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
  2652. objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
  2653. message expression in
  2654. UIWebView *webView = ...;
  2655. CGRect bodyFrame = webView.frame;
  2656. bodyFrame.size.height = self.bodyContentHeight;
  2657. webView.frame = bodyFrame;
  2658. // ^---- matches here
  2659. </pre></td></tr>
  2660. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
  2661. <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
  2662. Matches only when the selector of the objCMessageExpr is NULL. This may
  2663. represent an error condition in the tree!
  2664. </pre></td></tr>
  2665. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
  2666. <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
  2667. matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
  2668. matches the outer message expr in the code below, but NOT the message
  2669. invocation for self.bodyView.
  2670. [self.bodyView loadHTMLString:html baseURL:NULL];
  2671. </pre></td></tr>
  2672. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
  2673. <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
  2674. matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
  2675. matches self.bodyView in the code below, but NOT the outer message
  2676. invocation of "loadHTMLString:baseURL:".
  2677. [self.bodyView loadHTMLString:html baseURL:NULL];
  2678. </pre></td></tr>
  2679. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
  2680. <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
  2681. Example
  2682. matcher = objcMessageExpr(isClassMessage())
  2683. matches
  2684. [NSString stringWithFormat:@"format"];
  2685. but not
  2686. NSString *x = @"hello";
  2687. [x containsString:@"h"];
  2688. </pre></td></tr>
  2689. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
  2690. <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
  2691. Example
  2692. matcher = objcMessageExpr(isInstanceMessage())
  2693. matches
  2694. NSString *x = @"hello";
  2695. [x containsString:@"h"];
  2696. but not
  2697. [NSString stringWithFormat:@"format"];
  2698. </pre></td></tr>
  2699. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
  2700. <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
  2701. a substring matched by the given RegExp.
  2702. matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
  2703. invocation for self.bodyView.
  2704. [self.bodyView loadHTMLString:html baseURL:NULL];
  2705. </pre></td></tr>
  2706. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
  2707. <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
  2708. matcher = objCMessageExpr(numSelectorArgs(0));
  2709. matches self.bodyView in the code below
  2710. matcher = objCMessageExpr(numSelectorArgs(2));
  2711. matches the invocation of "loadHTMLString:baseURL:" but not that
  2712. of self.bodyView
  2713. [self.bodyView loadHTMLString:html baseURL:NULL];
  2714. </pre></td></tr>
  2715. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
  2716. <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
  2717. Example
  2718. matcher = objcMethodDecl(isClassMethod())
  2719. matches
  2720. @interface I + (void)foo; @end
  2721. but not
  2722. @interface I - (void)bar; @end
  2723. </pre></td></tr>
  2724. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
  2725. <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
  2726. Example matches A, va, fa
  2727. class A {};
  2728. class B; // Doesn't match, as it has no body.
  2729. int va;
  2730. extern int vb; // Doesn't match, as it doesn't define the variable.
  2731. void fa() {}
  2732. void fb(); // Doesn't match, as it has no body.
  2733. @interface X
  2734. - (void)ma; // Doesn't match, interface is declaration.
  2735. @end
  2736. @implementation X
  2737. - (void)ma {}
  2738. @end
  2739. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
  2740. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
  2741. </pre></td></tr>
  2742. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
  2743. <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
  2744. Example
  2745. matcher = objcMethodDecl(isInstanceMethod())
  2746. matches
  2747. @interface I - (void)bar; @end
  2748. but not
  2749. @interface I + (void)foo; @end
  2750. </pre></td></tr>
  2751. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
  2752. <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
  2753. Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
  2754. void x(int val) {}
  2755. void y(int val = 0) {}
  2756. </pre></td></tr>
  2757. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
  2758. <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
  2759. Given
  2760. class Y { public: void x(); };
  2761. void z() { Y* y; y-&gt;x(); }
  2762. cxxMemberCallExpr(on(hasType(asString("class Y *"))))
  2763. matches y-&gt;x()
  2764. </pre></td></tr>
  2765. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
  2766. <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
  2767. Matches a node if it equals the node previously bound to ID.
  2768. Given
  2769. class X { int a; int b; };
  2770. cxxRecordDecl(
  2771. has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
  2772. has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
  2773. matches the class X, as a and b have the same type.
  2774. Note that when multiple matches are involved via forEach* matchers,
  2775. equalsBoundNodes acts as a filter.
  2776. For example:
  2777. compoundStmt(
  2778. forEachDescendant(varDecl().bind("d")),
  2779. forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
  2780. will trigger a match for each combination of variable declaration
  2781. and reference to that variable declaration within a compound statement.
  2782. </pre></td></tr>
  2783. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
  2784. <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
  2785. the node, not hidden within a typedef.
  2786. Given
  2787. typedef const int const_int;
  2788. const_int i;
  2789. int *const j;
  2790. int *volatile k;
  2791. int m;
  2792. varDecl(hasType(hasLocalQualifiers())) matches only j and k.
  2793. i is const-qualified but the qualifier is not local.
  2794. </pre></td></tr>
  2795. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
  2796. <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
  2797. Given
  2798. void a(char);
  2799. void b(wchar_t);
  2800. void c(double);
  2801. functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
  2802. matches "a(char)", "b(wchar_t)", but not "c(double)".
  2803. </pre></td></tr>
  2804. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
  2805. <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
  2806. the Objective-C object pointer type, which is different despite being
  2807. syntactically similar.
  2808. Given
  2809. int *i = nullptr;
  2810. @interface Foo
  2811. @end
  2812. Foo *f;
  2813. int j;
  2814. varDecl(hasType(isAnyPointer()))
  2815. matches "int *i" and "Foo *f", but not "int j".
  2816. </pre></td></tr>
  2817. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
  2818. <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
  2819. include "top-level" const.
  2820. Given
  2821. void a(int);
  2822. void b(int const);
  2823. void c(const int);
  2824. void d(const int*);
  2825. void e(int const) {};
  2826. functionDecl(hasAnyParameter(hasType(isConstQualified())))
  2827. matches "void b(int const)", "void c(const int)" and
  2828. "void e(int const) {}". It does not match d as there
  2829. is no top-level const on the parameter type "const int *".
  2830. </pre></td></tr>
  2831. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
  2832. <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
  2833. Given
  2834. void a(int);
  2835. void b(long);
  2836. void c(double);
  2837. functionDecl(hasAnyParameter(hasType(isInteger())))
  2838. matches "a(int)", "b(long)", but not "c(double)".
  2839. </pre></td></tr>
  2840. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
  2841. <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
  2842. Given
  2843. void a(int);
  2844. void b(unsigned long);
  2845. void c(double);
  2846. functionDecl(hasAnyParameter(hasType(isSignedInteger())))
  2847. matches "a(int)", but not "b(unsigned long)" and "c(double)".
  2848. </pre></td></tr>
  2849. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
  2850. <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
  2851. Given
  2852. void a(int);
  2853. void b(unsigned long);
  2854. void c(double);
  2855. functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
  2856. matches "b(unsigned long)", but not "a(int)" and "c(double)".
  2857. </pre></td></tr>
  2858. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
  2859. <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
  2860. include "top-level" volatile.
  2861. Given
  2862. void a(int);
  2863. void b(int volatile);
  2864. void c(volatile int);
  2865. void d(volatile int*);
  2866. void e(int volatile) {};
  2867. functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
  2868. matches "void b(int volatile)", "void c(volatile int)" and
  2869. "void e(int volatile) {}". It does not match d as there
  2870. is no top-level volatile on the parameter type "volatile int *".
  2871. </pre></td></tr>
  2872. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
  2873. <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
  2874. Example matches C, but not S or U.
  2875. struct S {};
  2876. class C {};
  2877. union U {};
  2878. </pre></td></tr>
  2879. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
  2880. <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
  2881. Example matches S, but not C or U.
  2882. struct S {};
  2883. class C {};
  2884. union U {};
  2885. </pre></td></tr>
  2886. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
  2887. <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
  2888. Example matches U, but not C or S.
  2889. struct S {};
  2890. class C {};
  2891. union U {};
  2892. </pre></td></tr>
  2893. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
  2894. <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
  2895. Matches a node if it equals the node previously bound to ID.
  2896. Given
  2897. class X { int a; int b; };
  2898. cxxRecordDecl(
  2899. has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
  2900. has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
  2901. matches the class X, as a and b have the same type.
  2902. Note that when multiple matches are involved via forEach* matchers,
  2903. equalsBoundNodes acts as a filter.
  2904. For example:
  2905. compoundStmt(
  2906. forEachDescendant(varDecl().bind("d")),
  2907. forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
  2908. will trigger a match for each combination of variable declaration
  2909. and reference to that variable declaration within a compound statement.
  2910. </pre></td></tr>
  2911. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
  2912. <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
  2913. Stmt has pointer identity in the AST.
  2914. </pre></td></tr>
  2915. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
  2916. <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
  2917. partially matching a given regex.
  2918. Example matches Y but not X
  2919. (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
  2920. #include "ASTMatcher.h"
  2921. class X {};
  2922. ASTMatcher.h:
  2923. class Y {};
  2924. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2925. </pre></td></tr>
  2926. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
  2927. <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
  2928. Example matches X but not Y
  2929. (matcher = cxxRecordDecl(isExpansionInMainFile())
  2930. #include &lt;Y.h&gt;
  2931. class X {};
  2932. Y.h:
  2933. class Y {};
  2934. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2935. </pre></td></tr>
  2936. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
  2937. <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
  2938. Example matches Y but not X
  2939. (matcher = cxxRecordDecl(isExpansionInSystemHeader())
  2940. #include &lt;SystemHeader.h&gt;
  2941. class X {};
  2942. SystemHeader.h:
  2943. class Y {};
  2944. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  2945. </pre></td></tr>
  2946. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isOMPStructuredBlock0')"><a name="isOMPStructuredBlock0Anchor">isOMPStructuredBlock</a></td><td></td></tr>
  2947. <tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
  2948. of an OpenMP executable directive.
  2949. Given
  2950. #pragma omp parallel
  2951. {}
  2952. ``stmt(isOMPStructuredBlock()))`` matches ``{}``.
  2953. </pre></td></tr>
  2954. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
  2955. <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
  2956. Given
  2957. int a[42];
  2958. int b[2 * 21];
  2959. int c[41], d[43];
  2960. char *s = "abcd";
  2961. wchar_t *ws = L"abcd";
  2962. char *w = "a";
  2963. constantArrayType(hasSize(42))
  2964. matches "int a[42]" and "int b[2 * 21]"
  2965. stringLiteral(hasSize(4))
  2966. matches "abcd", L"abcd"
  2967. </pre></td></tr>
  2968. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
  2969. <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
  2970. Example matches A, va, fa
  2971. class A {};
  2972. class B; // Doesn't match, as it has no body.
  2973. int va;
  2974. extern int vb; // Doesn't match, as it doesn't define the variable.
  2975. void fa() {}
  2976. void fb(); // Doesn't match, as it has no body.
  2977. @interface X
  2978. - (void)ma; // Doesn't match, interface is declaration.
  2979. @end
  2980. @implementation X
  2981. - (void)ma {}
  2982. @end
  2983. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
  2984. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
  2985. </pre></td></tr>
  2986. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
  2987. <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
  2988. Note that 'Value' is a string as the template argument's value is
  2989. an arbitrary precision integer. 'Value' must be euqal to the canonical
  2990. representation of that integral value in base 10.
  2991. Given
  2992. template&lt;int T&gt; struct C {};
  2993. C&lt;42&gt; c;
  2994. classTemplateSpecializationDecl(
  2995. hasAnyTemplateArgument(equalsIntegralValue("42")))
  2996. matches the implicit instantiation of C in C&lt;42&gt;.
  2997. </pre></td></tr>
  2998. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
  2999. <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
  3000. Given
  3001. template&lt;int T&gt; struct C {};
  3002. C&lt;42&gt; c;
  3003. classTemplateSpecializationDecl(
  3004. hasAnyTemplateArgument(isIntegral()))
  3005. matches the implicit instantiation of C in C&lt;42&gt;
  3006. with isIntegral() matching 42.
  3007. </pre></td></tr>
  3008. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
  3009. <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
  3010. Given
  3011. template&lt;typename T&gt; struct C {};
  3012. C&lt;int&gt; c;
  3013. classTemplateSpecializationDecl(templateArgumentCountIs(1))
  3014. matches C&lt;int&gt;.
  3015. </pre></td></tr>
  3016. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
  3017. <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
  3018. partially matching a given regex.
  3019. Example matches Y but not X
  3020. (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
  3021. #include "ASTMatcher.h"
  3022. class X {};
  3023. ASTMatcher.h:
  3024. class Y {};
  3025. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  3026. </pre></td></tr>
  3027. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
  3028. <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
  3029. Example matches X but not Y
  3030. (matcher = cxxRecordDecl(isExpansionInMainFile())
  3031. #include &lt;Y.h&gt;
  3032. class X {};
  3033. Y.h:
  3034. class Y {};
  3035. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  3036. </pre></td></tr>
  3037. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
  3038. <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
  3039. Example matches Y but not X
  3040. (matcher = cxxRecordDecl(isExpansionInSystemHeader())
  3041. #include &lt;SystemHeader.h&gt;
  3042. class X {};
  3043. SystemHeader.h:
  3044. class Y {};
  3045. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
  3046. </pre></td></tr>
  3047. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
  3048. <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
  3049. Given
  3050. struct S { bool func(); };
  3051. functionDecl(returns(booleanType()))
  3052. matches "bool func();"
  3053. </pre></td></tr>
  3054. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
  3055. <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
  3056. Matches a node if it equals the node previously bound to ID.
  3057. Given
  3058. class X { int a; int b; };
  3059. cxxRecordDecl(
  3060. has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
  3061. has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
  3062. matches the class X, as a and b have the same type.
  3063. Note that when multiple matches are involved via forEach* matchers,
  3064. equalsBoundNodes acts as a filter.
  3065. For example:
  3066. compoundStmt(
  3067. forEachDescendant(varDecl().bind("d")),
  3068. forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
  3069. will trigger a match for each combination of variable declaration
  3070. and reference to that variable declaration within a compound statement.
  3071. </pre></td></tr>
  3072. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
  3073. <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
  3074. Type has pointer identity in the AST.
  3075. </pre></td></tr>
  3076. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
  3077. <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
  3078. Given
  3079. int i;
  3080. float f;
  3081. realFloatingPointType()
  3082. matches "float f" but not "int i"
  3083. </pre></td></tr>
  3084. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
  3085. <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
  3086. Given
  3087. struct S { void func(); };
  3088. functionDecl(returns(voidType()))
  3089. matches "void func();"
  3090. </pre></td></tr>
  3091. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
  3092. <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
  3093. Given
  3094. int x;
  3095. int s = sizeof(x) + alignof(x)
  3096. unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
  3097. matches sizeof(x)
  3098. If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
  3099. should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
  3100. </pre></td></tr>
  3101. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
  3102. <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
  3103. unary).
  3104. Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
  3105. !(a || b)
  3106. </pre></td></tr>
  3107. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
  3108. <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
  3109. to '.'.
  3110. Member calls on the implicit this pointer match as called with '-&gt;'.
  3111. Given
  3112. class Y {
  3113. void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
  3114. template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
  3115. int a;
  3116. static int b;
  3117. };
  3118. template &lt;class T&gt;
  3119. class Z {
  3120. void x() { this-&gt;m; }
  3121. };
  3122. memberExpr(isArrow())
  3123. matches this-&gt;x, x, y.x, a, this-&gt;b
  3124. cxxDependentScopeMemberExpr(isArrow())
  3125. matches this-&gt;m
  3126. unresolvedMemberExpr(isArrow())
  3127. matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
  3128. </pre></td></tr>
  3129. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
  3130. <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
  3131. Example matches x, but not y, z, or a.
  3132. (matcher = varDecl(hasAutomaticStorageDuration())
  3133. void f() {
  3134. int x;
  3135. static int y;
  3136. thread_local int z;
  3137. }
  3138. int a;
  3139. </pre></td></tr>
  3140. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
  3141. <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
  3142. Example matches y and z (matcher = varDecl(hasGlobalStorage())
  3143. void f() {
  3144. int x;
  3145. static int y;
  3146. }
  3147. int z;
  3148. </pre></td></tr>
  3149. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
  3150. <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
  3151. non-static local variable.
  3152. Example matches x (matcher = varDecl(hasLocalStorage())
  3153. void f() {
  3154. int x;
  3155. static int y;
  3156. }
  3157. int z;
  3158. </pre></td></tr>
  3159. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
  3160. <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
  3161. It includes the variable declared at namespace scope and those declared
  3162. with "static" and "extern" storage class specifiers.
  3163. void f() {
  3164. int x;
  3165. static int y;
  3166. thread_local int z;
  3167. }
  3168. int a;
  3169. static int b;
  3170. extern int c;
  3171. varDecl(hasStaticStorageDuration())
  3172. matches the function declaration y, a, b and c.
  3173. </pre></td></tr>
  3174. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
  3175. <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
  3176. Example matches z, but not x, z, or a.
  3177. (matcher = varDecl(hasThreadStorageDuration())
  3178. void f() {
  3179. int x;
  3180. static int y;
  3181. thread_local int z;
  3182. }
  3183. int a;
  3184. </pre></td></tr>
  3185. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
  3186. <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
  3187. and if constexpr.
  3188. Given:
  3189. constexpr int foo = 42;
  3190. constexpr int bar();
  3191. void baz() { if constexpr(1 &gt; 0) {} }
  3192. varDecl(isConstexpr())
  3193. matches the declaration of foo.
  3194. functionDecl(isConstexpr())
  3195. matches the declaration of bar.
  3196. ifStmt(isConstexpr())
  3197. matches the if statement in baz.
  3198. </pre></td></tr>
  3199. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
  3200. <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
  3201. Example matches A, va, fa
  3202. class A {};
  3203. class B; // Doesn't match, as it has no body.
  3204. int va;
  3205. extern int vb; // Doesn't match, as it doesn't define the variable.
  3206. void fa() {}
  3207. void fb(); // Doesn't match, as it has no body.
  3208. @interface X
  3209. - (void)ma; // Doesn't match, interface is declaration.
  3210. @end
  3211. @implementation X
  3212. - (void)ma {}
  3213. @end
  3214. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
  3215. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
  3216. </pre></td></tr>
  3217. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
  3218. <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
  3219. a C++ catch block, or an Objective-C statement.
  3220. Example matches x (matcher = varDecl(isExceptionVariable())
  3221. void f(int y) {
  3222. try {
  3223. } catch (int x) {
  3224. }
  3225. }
  3226. </pre></td></tr>
  3227. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
  3228. <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
  3229. static member variable template instantiations.
  3230. Given
  3231. template&lt;typename T&gt; void A(T t) { }
  3232. template&lt;&gt; void A(int N) { }
  3233. functionDecl(isExplicitTemplateSpecialization())
  3234. matches the specialization A&lt;int&gt;().
  3235. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  3236. </pre></td></tr>
  3237. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
  3238. <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
  3239. Given:
  3240. extern "C" void f() {}
  3241. extern "C" { void g() {} }
  3242. void h() {}
  3243. extern "C" int x = 1;
  3244. extern "C" int y = 2;
  3245. int z = 3;
  3246. functionDecl(isExternC())
  3247. matches the declaration of f and g, but not the declaration of h.
  3248. varDecl(isExternC())
  3249. matches the declaration of x and y, but not the declaration of z.
  3250. </pre></td></tr>
  3251. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
  3252. <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
  3253. Example matches y (matcher = varDecl(isStaticLocal()))
  3254. void f() {
  3255. int x;
  3256. static int y;
  3257. }
  3258. static int z;
  3259. </pre></td></tr>
  3260. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
  3261. <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
  3262. class specifier ("static" keyword) written in the source.
  3263. Given:
  3264. static void f() {}
  3265. static int i = 0;
  3266. extern int j;
  3267. int k;
  3268. functionDecl(isStaticStorageClass())
  3269. matches the function declaration f.
  3270. varDecl(isStaticStorageClass())
  3271. matches the variable declaration i.
  3272. </pre></td></tr>
  3273. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
  3274. <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
  3275. member variable template instantiations.
  3276. Given
  3277. template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
  3278. or
  3279. template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
  3280. or
  3281. template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
  3282. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  3283. matches the template instantiation of X&lt;A&gt;.
  3284. But given
  3285. template &lt;typename T&gt; class X {}; class A {};
  3286. template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
  3287. cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
  3288. does not match, as X&lt;A&gt; is an explicit template specialization.
  3289. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
  3290. </pre></td></tr>
  3291. <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
  3292. <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
  3293. template instantiations.
  3294. Given
  3295. template&lt;typename T&gt; void A(T t) { T i; }
  3296. A(0);
  3297. A(0U);
  3298. functionDecl(isInstantiated())
  3299. matches 'A(int) {...};' and 'A(unsigned) {...}'.
  3300. </pre></td></tr>
  3301. <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
  3302. <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
  3303. GNU's __null, C++11's nullptr, or C's NULL macro.
  3304. Given:
  3305. void *v1 = NULL;
  3306. void *v2 = nullptr;
  3307. void *v3 = __null; // GNU extension
  3308. char *cp = (char *)0;
  3309. int *ip = 0;
  3310. int i = 0;
  3311. expr(nullPointerConstant())
  3312. matches the initializer for v1, v2, v3, cp, and ip. Does not match the
  3313. initializer for i.
  3314. </pre></td></tr>
  3315. <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
  3316. <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
  3317. This matcher is only provided as a performance optimization of hasName.
  3318. hasAnyName(a, b, c)
  3319. is equivalent to, but faster than
  3320. anyOf(hasName(a), hasName(b), hasName(c))
  3321. </pre></td></tr>
  3322. <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
  3323. <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
  3324. Selector.getAsString()
  3325. matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
  3326. matches both of the expressions below:
  3327. [myObj methodA:argA];
  3328. [myObj methodB:argB];
  3329. </pre></td></tr>
  3330. <tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
  3331. <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
  3332. Given
  3333. int j;
  3334. template&lt;typename T&gt; void A(T t) { T i; j += 42;}
  3335. A(0);
  3336. A(0U);
  3337. declStmt(isInTemplateInstantiation())
  3338. matches 'int i;' and 'unsigned i'.
  3339. unless(stmt(isInTemplateInstantiation()))
  3340. will NOT match j += 42; as it's shared between the template definition and
  3341. instantiation.
  3342. </pre></td></tr>
  3343. <!--END_NARROWING_MATCHERS -->
  3344. </table>
  3345. <!-- ======================================================================= -->
  3346. <h2 id="traversal-matchers">AST Traversal Matchers</h2>
  3347. <!-- ======================================================================= -->
  3348. <p>Traversal matchers specify the relationship to other nodes that are
  3349. reachable from the current node.</p>
  3350. <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
  3351. forEachDescendant) which work on all nodes and allow users to write more generic
  3352. match expressions.</p>
  3353. <table>
  3354. <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
  3355. <!-- START_TRAVERSAL_MATCHERS -->
  3356. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
  3357. <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
  3358. Unlike anyOf, eachOf will generate a match result for each
  3359. matching submatcher.
  3360. For example, in:
  3361. class A { int a; int b; };
  3362. The matcher:
  3363. cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
  3364. has(fieldDecl(hasName("b")).bind("v"))))
  3365. will generate two results binding "v", the first of which binds
  3366. the field declaration of a, the second the field declaration of
  3367. b.
  3368. Usable as: Any Matcher
  3369. </pre></td></tr>
  3370. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
  3371. <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
  3372. provided matcher.
  3373. Example matches X, A, A::X, B, B::C, B::C::X
  3374. (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
  3375. class X {};
  3376. class A { class X {}; }; // Matches A, because A::X is a class of name
  3377. // X inside A.
  3378. class B { class C { class X {}; }; };
  3379. DescendantT must be an AST base type.
  3380. As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
  3381. each result that matches instead of only on the first one.
  3382. Note: Recursively combined ForEachDescendant can cause many matches:
  3383. cxxRecordDecl(forEachDescendant(cxxRecordDecl(
  3384. forEachDescendant(cxxRecordDecl())
  3385. )))
  3386. will match 10 times (plus injected class name matches) on:
  3387. class A { class B { class C { class D { class E {}; }; }; }; };
  3388. Usable as: Any Matcher
  3389. </pre></td></tr>
  3390. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
  3391. <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
  3392. provided matcher.
  3393. Example matches X, Y, Y::X, Z::Y, Z::Y::X
  3394. (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
  3395. class X {};
  3396. class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
  3397. // inside Y.
  3398. class Z { class Y { class X {}; }; }; // Does not match Z.
  3399. ChildT must be an AST base type.
  3400. As opposed to 'has', 'forEach' will cause a match for each result that
  3401. matches instead of only on the first one.
  3402. Usable as: Any Matcher
  3403. </pre></td></tr>
  3404. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
  3405. <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
  3406. matcher.
  3407. Given
  3408. void f() { if (true) { int x = 42; } }
  3409. void g() { for (;;) { int x = 43; } }
  3410. expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
  3411. Usable as: Any Matcher
  3412. </pre></td></tr>
  3413. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
  3414. <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
  3415. provided matcher.
  3416. Example matches X, Y, Z
  3417. (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
  3418. class X {}; // Matches X, because X::X is a class of name X inside X.
  3419. class Y { class X {}; };
  3420. class Z { class Y { class X {}; }; };
  3421. DescendantT must be an AST base type.
  3422. Usable as: Any Matcher
  3423. </pre></td></tr>
  3424. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
  3425. <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
  3426. provided matcher.
  3427. Example matches X, Y
  3428. (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
  3429. class X {}; // Matches X, because X::X is a class of name X inside X.
  3430. class Y { class X {}; };
  3431. class Z { class Y { class X {}; }; }; // Does not match Z.
  3432. ChildT must be an AST base type.
  3433. Usable as: Any Matcher
  3434. Note that has is direct matcher, so it also matches things like implicit
  3435. casts and paren casts. If you are matching with expr then you should
  3436. probably consider using ignoringParenImpCasts like:
  3437. has(ignoringParenImpCasts(expr())).
  3438. </pre></td></tr>
  3439. <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
  3440. <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
  3441. matcher.
  3442. Given
  3443. void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
  3444. compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
  3445. Usable as: Any Matcher
  3446. </pre></td></tr>
  3447. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3448. <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
  3449. switch statement or conditional operator.
  3450. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  3451. if (true) {}
  3452. </pre></td></tr>
  3453. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3454. <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
  3455. (binary or ternary).
  3456. Example matches b
  3457. condition ? a : b
  3458. condition ?: b
  3459. </pre></td></tr>
  3460. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3461. <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
  3462. Example 1 (conditional ternary operator): matches a
  3463. condition ? a : b
  3464. Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
  3465. condition ?: b
  3466. </pre></td></tr>
  3467. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  3468. <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
  3469. matches the given matcher.
  3470. The associated declaration is:
  3471. - for type nodes, the declaration of the underlying type
  3472. - for CallExpr, the declaration of the callee
  3473. - for MemberExpr, the declaration of the referenced member
  3474. - for CXXConstructExpr, the declaration of the constructor
  3475. - for CXXNewExpr, the declaration of the operator new
  3476. - for ObjCIvarExpr, the declaration of the ivar
  3477. For type nodes, hasDeclaration will generally match the declaration of the
  3478. sugared type. Given
  3479. class X {};
  3480. typedef X Y;
  3481. Y y;
  3482. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  3483. typedefDecl. A common use case is to match the underlying, desugared type.
  3484. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  3485. varDecl(hasType(hasUnqualifiedDesugaredType(
  3486. recordType(hasDeclaration(decl())))))
  3487. In this matcher, the decl will match the CXXRecordDecl of class X.
  3488. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  3489. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  3490. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  3491. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  3492. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  3493. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  3494. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  3495. </pre></td></tr>
  3496. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3497. <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
  3498. Given
  3499. int i[5];
  3500. void f() { i[1] = 42; }
  3501. arraySubscriptExpression(hasBase(implicitCastExpr(
  3502. hasSourceExpression(declRefExpr()))))
  3503. matches i[1] with the declRefExpr() matching i
  3504. </pre></td></tr>
  3505. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3506. <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
  3507. Given
  3508. int i[5];
  3509. void f() { i[1] = 42; }
  3510. arraySubscriptExpression(hasIndex(integerLiteral()))
  3511. matches i[1] with the integerLiteral() matching 1
  3512. </pre></td></tr>
  3513. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3514. <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
  3515. Example matches a (matcher = binaryOperator(hasLHS()))
  3516. a || b
  3517. </pre></td></tr>
  3518. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3519. <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
  3520. Example matches b (matcher = binaryOperator(hasRHS()))
  3521. a || b
  3522. </pre></td></tr>
  3523. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  3524. <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
  3525. type.
  3526. Given
  3527. struct A {};
  3528. A a[7];
  3529. int b[7];
  3530. arrayType(hasElementType(builtinType()))
  3531. matches "int b[7]"
  3532. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
  3533. </pre></td></tr>
  3534. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;</td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  3535. <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
  3536. Given
  3537. _Atomic(int) i;
  3538. _Atomic(float) f;
  3539. atomicType(hasValueType(isInteger()))
  3540. matches "_Atomic(int) i"
  3541. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
  3542. </pre></td></tr>
  3543. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;</td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  3544. <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
  3545. Note: There is no TypeLoc for the deduced type and thus no
  3546. getDeducedLoc() matcher.
  3547. Given
  3548. auto a = 1;
  3549. auto b = 2.0;
  3550. autoType(hasDeducedType(isInteger()))
  3551. matches "auto a"
  3552. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
  3553. </pre></td></tr>
  3554. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3555. <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
  3556. binary operator matches.
  3557. </pre></td></tr>
  3558. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3559. <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
  3560. Example matches a (matcher = binaryOperator(hasLHS()))
  3561. a || b
  3562. </pre></td></tr>
  3563. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3564. <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
  3565. Example matches b (matcher = binaryOperator(hasRHS()))
  3566. a || b
  3567. </pre></td></tr>
  3568. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  3569. <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
  3570. block.
  3571. Does not match the 'this' parameter of a method.
  3572. Given
  3573. class X { void f(int x, int y, int z) {} };
  3574. cxxMethodDecl(hasAnyParameter(hasName("y")))
  3575. matches f(int x, int y, int z) {}
  3576. with hasAnyParameter(...)
  3577. matching int y
  3578. For ObjectiveC, given
  3579. @interface I - (void) f:(int) y; @end
  3580. the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
  3581. matches the declaration of method f with hasParameter
  3582. matching y.
  3583. For blocks, given
  3584. b = ^(int y) { printf("%d", y) };
  3585. the matcher blockDecl(hasAnyParameter(hasName("y")))
  3586. matches the declaration of the block b with hasParameter
  3587. matching y.
  3588. </pre></td></tr>
  3589. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  3590. <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
  3591. declaration or a block.
  3592. Given
  3593. class X { void f(int x) {} };
  3594. cxxMethodDecl(hasParameter(0, hasType(varDecl())))
  3595. matches f(int x) {}
  3596. with hasParameter(...)
  3597. matching int x
  3598. For ObjectiveC, given
  3599. @interface I - (void) f:(int) y; @end
  3600. the matcher objcMethodDecl(hasParameter(0, hasName("y")))
  3601. matches the declaration of method f with hasParameter
  3602. matching y.
  3603. </pre></td></tr>
  3604. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  3605. <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
  3606. pointee matches a given matcher.
  3607. Given
  3608. int *a;
  3609. int const *b;
  3610. float const *f;
  3611. pointerType(pointee(isConstQualified(), isInteger()))
  3612. matches "int const *b"
  3613. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
  3614. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
  3615. </pre></td></tr>
  3616. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
  3617. <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
  3618. Given
  3619. void f(int i);
  3620. int y;
  3621. f(y);
  3622. callExpr(
  3623. forEachArgumentWithParam(
  3624. declRefExpr(to(varDecl(hasName("y")))),
  3625. parmVarDecl(hasType(isInteger()))
  3626. ))
  3627. matches f(y);
  3628. with declRefExpr(...)
  3629. matching int y
  3630. and parmVarDecl(...)
  3631. matching int i
  3632. </pre></td></tr>
  3633. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3634. <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
  3635. expression, or an ObjC-message-send expression.
  3636. Given
  3637. void x(int, int, int) { int y; x(1, y, 42); }
  3638. callExpr(hasAnyArgument(declRefExpr()))
  3639. matches x(1, y, 42)
  3640. with hasAnyArgument(...)
  3641. matching y
  3642. For ObjectiveC, given
  3643. @interface I - (void) f:(int) y; @end
  3644. void foo(I *i) { [i f:12]; }
  3645. objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
  3646. matches [i f:12]
  3647. </pre></td></tr>
  3648. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3649. <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
  3650. call expression.
  3651. Example matches y in x(y)
  3652. (matcher = callExpr(hasArgument(0, declRefExpr())))
  3653. void x(int) { int y; x(y); }
  3654. </pre></td></tr>
  3655. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  3656. <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
  3657. matches the given matcher.
  3658. The associated declaration is:
  3659. - for type nodes, the declaration of the underlying type
  3660. - for CallExpr, the declaration of the callee
  3661. - for MemberExpr, the declaration of the referenced member
  3662. - for CXXConstructExpr, the declaration of the constructor
  3663. - for CXXNewExpr, the declaration of the operator new
  3664. - for ObjCIvarExpr, the declaration of the ivar
  3665. For type nodes, hasDeclaration will generally match the declaration of the
  3666. sugared type. Given
  3667. class X {};
  3668. typedef X Y;
  3669. Y y;
  3670. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  3671. typedefDecl. A common use case is to match the underlying, desugared type.
  3672. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  3673. varDecl(hasType(hasUnqualifiedDesugaredType(
  3674. recordType(hasDeclaration(decl())))))
  3675. In this matcher, the decl will match the CXXRecordDecl of class X.
  3676. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  3677. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  3678. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  3679. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  3680. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  3681. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  3682. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  3683. </pre></td></tr>
  3684. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
  3685. <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
  3686. Given
  3687. class A { A() : i(42), j(42) {} int i; int j; };
  3688. cxxConstructorDecl(forEachConstructorInitializer(
  3689. forField(decl().bind("x"))
  3690. ))
  3691. will trigger two matches, binding for 'i' and 'j' respectively.
  3692. </pre></td></tr>
  3693. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
  3694. <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
  3695. Given
  3696. struct Foo {
  3697. Foo() : foo_(1) { }
  3698. int foo_;
  3699. };
  3700. cxxRecordDecl(has(cxxConstructorDecl(
  3701. hasAnyConstructorInitializer(anything())
  3702. )))
  3703. record matches Foo, hasAnyConstructorInitializer matches foo_(1)
  3704. </pre></td></tr>
  3705. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
  3706. <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
  3707. Given
  3708. struct Foo {
  3709. Foo() : foo_(1) { }
  3710. int foo_;
  3711. };
  3712. cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
  3713. forField(hasName("foo_"))))))
  3714. matches Foo
  3715. with forField matching foo_
  3716. </pre></td></tr>
  3717. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3718. <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
  3719. Given
  3720. struct Foo {
  3721. Foo() : foo_(1) { }
  3722. int foo_;
  3723. };
  3724. cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
  3725. withInitializer(integerLiteral(equals(1)))))))
  3726. matches Foo
  3727. with withInitializer matching (1)
  3728. </pre></td></tr>
  3729. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3730. <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
  3731. given matcher. Implicit object expressions are included; that is, it matches
  3732. use of implicit `this`.
  3733. Given
  3734. struct X {
  3735. int m;
  3736. int f(X x) { x.m; return m; }
  3737. };
  3738. memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
  3739. matches `x.m`, but not `m`; however,
  3740. memberExpr(hasObjectExpression(hasType(pointsTo(
  3741. cxxRecordDecl(hasName("X"))))))
  3742. matches `m` (aka. `this-&gt;m`), but not `x.m`.
  3743. </pre></td></tr>
  3744. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  3745. <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
  3746. definition that has a given body.
  3747. Given
  3748. for (;;) {}
  3749. hasBody(compoundStmt())
  3750. matches 'for (;;) {}'
  3751. with compoundStmt()
  3752. matching '{}'
  3753. </pre></td></tr>
  3754. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
  3755. <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
  3756. Example:
  3757. forStmt(hasLoopVariable(anything()))
  3758. matches 'int x' in
  3759. for (int x : a) { }
  3760. </pre></td></tr>
  3761. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3762. <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
  3763. Example:
  3764. forStmt(hasRangeInit(anything()))
  3765. matches 'a' in
  3766. for (int x : a) { }
  3767. </pre></td></tr>
  3768. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3769. <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
  3770. `on`, matches the argument directly without stripping away anything.
  3771. Given
  3772. class Y { public: void m(); };
  3773. Y g();
  3774. class X : public Y { void g(); };
  3775. void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
  3776. cxxMemberCallExpr(onImplicitObjectArgument(hasType(
  3777. cxxRecordDecl(hasName("Y")))))
  3778. matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
  3779. cxxMemberCallExpr(on(callExpr()))
  3780. does not match `(g()).m()`, because the parens are not ignored.
  3781. FIXME: Overload to allow directly matching types?
  3782. </pre></td></tr>
  3783. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3784. <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
  3785. stripping off any parentheses or implicit casts.
  3786. Given
  3787. class Y { public: void m(); };
  3788. Y g();
  3789. class X : public Y {};
  3790. void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
  3791. cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
  3792. matches `y.m()` and `(g()).m()`.
  3793. cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
  3794. matches `x.m()`.
  3795. cxxMemberCallExpr(on(callExpr()))
  3796. matches `(g()).m()`.
  3797. FIXME: Overload to allow directly matching types?
  3798. </pre></td></tr>
  3799. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  3800. <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
  3801. </pre></td></tr>
  3802. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  3803. <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
  3804. matches the InnerMatcher, or is a pointer to a type that matches the
  3805. InnerMatcher.
  3806. Given
  3807. class Y { public: void m(); };
  3808. class X : public Y { void g(); };
  3809. void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
  3810. cxxMemberCallExpr(thisPointerType(hasDeclaration(
  3811. cxxRecordDecl(hasName("Y")))))
  3812. matches `y.m()`, `p-&gt;m()` and `x.m()`.
  3813. cxxMemberCallExpr(thisPointerType(hasDeclaration(
  3814. cxxRecordDecl(hasName("X")))))
  3815. matches `x.g()`.
  3816. </pre></td></tr>
  3817. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
  3818. <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
  3819. produce multiple matches.
  3820. Given
  3821. class A { virtual void f(); };
  3822. class B : public A { void f(); };
  3823. class C : public B { void f(); };
  3824. cxxMethodDecl(ofClass(hasName("C")),
  3825. forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
  3826. matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
  3827. that B::f is not overridden by C::f).
  3828. The check can produce multiple matches in case of multiple inheritance, e.g.
  3829. class A1 { virtual void f(); };
  3830. class A2 { virtual void f(); };
  3831. class C : public A1, public A2 { void f(); };
  3832. cxxMethodDecl(ofClass(hasName("C")),
  3833. forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
  3834. matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
  3835. once with "b" binding "A2::f" and "d" binding "C::f".
  3836. </pre></td></tr>
  3837. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
  3838. <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
  3839. belongs to.
  3840. FIXME: Generalize this for other kinds of declarations.
  3841. FIXME: What other kind of declarations would we need to generalize
  3842. this to?
  3843. Example matches A() in the last line
  3844. (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
  3845. ofClass(hasName("A"))))))
  3846. class A {
  3847. public:
  3848. A();
  3849. };
  3850. A a = A();
  3851. </pre></td></tr>
  3852. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3853. <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
  3854. Given:
  3855. MyClass *p1 = new MyClass[10];
  3856. cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
  3857. matches the expression 'new MyClass[10]'.
  3858. </pre></td></tr>
  3859. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  3860. <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
  3861. matches the given matcher.
  3862. The associated declaration is:
  3863. - for type nodes, the declaration of the underlying type
  3864. - for CallExpr, the declaration of the callee
  3865. - for MemberExpr, the declaration of the referenced member
  3866. - for CXXConstructExpr, the declaration of the constructor
  3867. - for CXXNewExpr, the declaration of the operator new
  3868. - for ObjCIvarExpr, the declaration of the ivar
  3869. For type nodes, hasDeclaration will generally match the declaration of the
  3870. sugared type. Given
  3871. class X {};
  3872. typedef X Y;
  3873. Y y;
  3874. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  3875. typedefDecl. A common use case is to match the underlying, desugared type.
  3876. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  3877. varDecl(hasType(hasUnqualifiedDesugaredType(
  3878. recordType(hasDeclaration(decl())))))
  3879. In this matcher, the decl will match the CXXRecordDecl of class X.
  3880. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  3881. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  3882. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  3883. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  3884. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  3885. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  3886. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  3887. </pre></td></tr>
  3888. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
  3889. <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
  3890. Given:
  3891. class A { void func(); };
  3892. class B { void member(); };
  3893. cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
  3894. A but not B.
  3895. </pre></td></tr>
  3896. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  3897. <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
  3898. matching Base, or Objective-C classes that directly or indirectly
  3899. subclass a class matching Base.
  3900. Note that a class is not considered to be derived from itself.
  3901. Example matches Y, Z, C (Base == hasName("X"))
  3902. class X;
  3903. class Y : public X {}; // directly derived
  3904. class Z : public Y {}; // indirectly derived
  3905. typedef X A;
  3906. typedef A B;
  3907. class C : public B {}; // derived from a typedef of X
  3908. In the following example, Bar matches isDerivedFrom(hasName("X")):
  3909. class Foo;
  3910. typedef Foo X;
  3911. class Bar : public Foo {}; // derived from a type that X is a typedef of
  3912. In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
  3913. @interface NSObject @end
  3914. @interface Bar : NSObject @end
  3915. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
  3916. </pre></td></tr>
  3917. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  3918. <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
  3919. matching Base.
  3920. Note that a class is not considered to be derived from itself.
  3921. Example matches Y, C (Base == hasName("X"))
  3922. class X;
  3923. class Y : public X {}; // directly derived
  3924. class Z : public Y {}; // indirectly derived
  3925. typedef X A;
  3926. typedef A B;
  3927. class C : public B {}; // derived from a typedef of X
  3928. In the following example, Bar matches isDerivedFrom(hasName("X")):
  3929. class Foo;
  3930. typedef Foo X;
  3931. class Bar : public Foo {}; // derived from a type that X is a typedef of
  3932. </pre></td></tr>
  3933. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  3934. <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
  3935. match Base.
  3936. </pre></td></tr>
  3937. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3938. <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
  3939. expression, or an ObjC-message-send expression.
  3940. Given
  3941. void x(int, int, int) { int y; x(1, y, 42); }
  3942. callExpr(hasAnyArgument(declRefExpr()))
  3943. matches x(1, y, 42)
  3944. with hasAnyArgument(...)
  3945. matching y
  3946. For ObjectiveC, given
  3947. @interface I - (void) f:(int) y; @end
  3948. void foo(I *i) { [i f:12]; }
  3949. objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
  3950. matches [i f:12]
  3951. </pre></td></tr>
  3952. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  3953. <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
  3954. given matcher.
  3955. Example matches y.x() (matcher = callExpr(callee(
  3956. cxxMethodDecl(hasName("x")))))
  3957. class Y { public: void x(); };
  3958. void z() { Y y; y.x(); }
  3959. </pre></td></tr>
  3960. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  3961. <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
  3962. Given
  3963. class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
  3964. void f() { f(); }
  3965. callExpr(callee(expr()))
  3966. matches this-&gt;x(), x(), y.x(), f()
  3967. with callee(...)
  3968. matching this-&gt;x, x, y.x, f respectively
  3969. Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
  3970. because this introduces ambiguous overloads with calls to Callee taking a
  3971. internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
  3972. implemented in terms of implicit casts.
  3973. </pre></td></tr>
  3974. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
  3975. <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
  3976. Given
  3977. void f(int i);
  3978. int y;
  3979. f(y);
  3980. callExpr(
  3981. forEachArgumentWithParam(
  3982. declRefExpr(to(varDecl(hasName("y")))),
  3983. parmVarDecl(hasType(isInteger()))
  3984. ))
  3985. matches f(y);
  3986. with declRefExpr(...)
  3987. matching int y
  3988. and parmVarDecl(...)
  3989. matching int i
  3990. </pre></td></tr>
  3991. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  3992. <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
  3993. expression, or an ObjC-message-send expression.
  3994. Given
  3995. void x(int, int, int) { int y; x(1, y, 42); }
  3996. callExpr(hasAnyArgument(declRefExpr()))
  3997. matches x(1, y, 42)
  3998. with hasAnyArgument(...)
  3999. matching y
  4000. For ObjectiveC, given
  4001. @interface I - (void) f:(int) y; @end
  4002. void foo(I *i) { [i f:12]; }
  4003. objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
  4004. matches [i f:12]
  4005. </pre></td></tr>
  4006. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4007. <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
  4008. call expression.
  4009. Example matches y in x(y)
  4010. (matcher = callExpr(hasArgument(0, declRefExpr())))
  4011. void x(int) { int y; x(y); }
  4012. </pre></td></tr>
  4013. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4014. <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
  4015. matches the given matcher.
  4016. The associated declaration is:
  4017. - for type nodes, the declaration of the underlying type
  4018. - for CallExpr, the declaration of the callee
  4019. - for MemberExpr, the declaration of the referenced member
  4020. - for CXXConstructExpr, the declaration of the constructor
  4021. - for CXXNewExpr, the declaration of the operator new
  4022. - for ObjCIvarExpr, the declaration of the ivar
  4023. For type nodes, hasDeclaration will generally match the declaration of the
  4024. sugared type. Given
  4025. class X {};
  4026. typedef X Y;
  4027. Y y;
  4028. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4029. typedefDecl. A common use case is to match the underlying, desugared type.
  4030. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4031. varDecl(hasType(hasUnqualifiedDesugaredType(
  4032. recordType(hasDeclaration(decl())))))
  4033. In this matcher, the decl will match the CXXRecordDecl of class X.
  4034. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4035. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4036. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4037. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4038. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4039. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4040. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4041. </pre></td></tr>
  4042. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4043. <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
  4044. extension, matches the constant given in the statement.
  4045. Given
  4046. switch (1) { case 1: case 1+1: case 3 ... 4: ; }
  4047. caseStmt(hasCaseConstant(integerLiteral()))
  4048. matches "case 1:"
  4049. </pre></td></tr>
  4050. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4051. <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
  4052. or opaque value's source expression matches the given matcher.
  4053. Example 1: matches "a string"
  4054. (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
  4055. class URL { URL(string); };
  4056. URL url = "a string";
  4057. Example 2: matches 'b' (matcher =
  4058. opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
  4059. int a = b ?: 1;
  4060. </pre></td></tr>
  4061. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  4062. <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  4063. functionDecl that have at least one TemplateArgument matching the given
  4064. InnerMatcher.
  4065. Given
  4066. template&lt;typename T&gt; class A {};
  4067. template&lt;&gt; class A&lt;double&gt; {};
  4068. A&lt;int&gt; a;
  4069. template&lt;typename T&gt; f() {};
  4070. void func() { f&lt;int&gt;(); };
  4071. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  4072. refersToType(asString("int"))))
  4073. matches the specialization A&lt;int&gt;
  4074. functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
  4075. matches the specialization f&lt;int&gt;
  4076. </pre></td></tr>
  4077. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
  4078. <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
  4079. Given
  4080. template&lt;typename T&gt; class A {}; #1
  4081. template&lt;&gt; class A&lt;int&gt; {}; #2
  4082. classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
  4083. matches '#2' with classTemplateDecl() matching the class template
  4084. declaration of 'A' at #1.
  4085. </pre></td></tr>
  4086. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  4087. <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  4088. functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
  4089. Given
  4090. template&lt;typename T, typename U&gt; class A {};
  4091. A&lt;bool, int&gt; b;
  4092. A&lt;int, bool&gt; c;
  4093. template&lt;typename T&gt; void f() {}
  4094. void func() { f&lt;int&gt;(); };
  4095. classTemplateSpecializationDecl(hasTemplateArgument(
  4096. 1, refersToType(asString("int"))))
  4097. matches the specialization A&lt;bool, int&gt;
  4098. functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
  4099. matches the specialization f&lt;int&gt;
  4100. </pre></td></tr>
  4101. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  4102. <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
  4103. type.
  4104. Given
  4105. struct A {};
  4106. A a[7];
  4107. int b[7];
  4108. arrayType(hasElementType(builtinType()))
  4109. matches "int b[7]"
  4110. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
  4111. </pre></td></tr>
  4112. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4113. <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
  4114. a given matcher. Also matches StmtExprs that have CompoundStmt as children.
  4115. Given
  4116. { {}; 1+2; }
  4117. hasAnySubstatement(compoundStmt())
  4118. matches '{ {}; 1+2; }'
  4119. with compoundStmt()
  4120. matching '{}'
  4121. </pre></td></tr>
  4122. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
  4123. <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
  4124. </pre></td></tr>
  4125. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4126. <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
  4127. matches the given matcher.
  4128. The associated declaration is:
  4129. - for type nodes, the declaration of the underlying type
  4130. - for CallExpr, the declaration of the callee
  4131. - for MemberExpr, the declaration of the referenced member
  4132. - for CXXConstructExpr, the declaration of the constructor
  4133. - for CXXNewExpr, the declaration of the operator new
  4134. - for ObjCIvarExpr, the declaration of the ivar
  4135. For type nodes, hasDeclaration will generally match the declaration of the
  4136. sugared type. Given
  4137. class X {};
  4138. typedef X Y;
  4139. Y y;
  4140. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4141. typedefDecl. A common use case is to match the underlying, desugared type.
  4142. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4143. varDecl(hasType(hasUnqualifiedDesugaredType(
  4144. recordType(hasDeclaration(decl())))))
  4145. In this matcher, the decl will match the CXXRecordDecl of class X.
  4146. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4147. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4148. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4149. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4150. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4151. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4152. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4153. </pre></td></tr>
  4154. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
  4155. <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
  4156. specific using shadow declaration.
  4157. Given
  4158. namespace a { void f() {} }
  4159. using a::f;
  4160. void g() {
  4161. f(); // Matches this ..
  4162. a::f(); // .. but not this.
  4163. }
  4164. declRefExpr(throughUsingDecl(anything()))
  4165. matches f()
  4166. </pre></td></tr>
  4167. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4168. <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
  4169. specified matcher.
  4170. Example matches x in if(x)
  4171. (matcher = declRefExpr(to(varDecl(hasName("x")))))
  4172. bool x;
  4173. if (x) {}
  4174. </pre></td></tr>
  4175. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4176. <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
  4177. Note that this does not work for global declarations because the AST
  4178. breaks up multiple-declaration DeclStmt's into multiple single-declaration
  4179. DeclStmt's.
  4180. Example: Given non-global declarations
  4181. int a, b = 0;
  4182. int c;
  4183. int d = 2, e;
  4184. declStmt(containsDeclaration(
  4185. 0, varDecl(hasInitializer(anything()))))
  4186. matches only 'int d = 2, e;', and
  4187. declStmt(containsDeclaration(1, varDecl()))
  4188. matches 'int a, b = 0' as well as 'int d = 2, e;'
  4189. but 'int c;' is not matched.
  4190. </pre></td></tr>
  4191. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4192. <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
  4193. Given
  4194. int a, b;
  4195. int c;
  4196. declStmt(hasSingleDecl(anything()))
  4197. matches 'int c;' but not 'int a, b;'.
  4198. </pre></td></tr>
  4199. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
  4200. <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
  4201. the inner matcher.
  4202. Given
  4203. int x;
  4204. declaratorDecl(hasTypeLoc(loc(asString("int"))))
  4205. matches int x
  4206. </pre></td></tr>
  4207. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4208. <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
  4209. Decl, matches InnerMatcher.
  4210. Given
  4211. namespace N {
  4212. namespace M {
  4213. class D {};
  4214. }
  4215. }
  4216. cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
  4217. declaration of class D.
  4218. </pre></td></tr>
  4219. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  4220. <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
  4221. Given
  4222. decltype(1) a = 1;
  4223. decltype(2.0) b = 2.0;
  4224. decltypeType(hasUnderlyingType(isInteger()))
  4225. matches the type of "a"
  4226. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
  4227. </pre></td></tr>
  4228. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4229. <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
  4230. definition that has a given body.
  4231. Given
  4232. for (;;) {}
  4233. hasBody(compoundStmt())
  4234. matches 'for (;;) {}'
  4235. with compoundStmt()
  4236. matching '{}'
  4237. </pre></td></tr>
  4238. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4239. <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
  4240. switch statement or conditional operator.
  4241. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  4242. if (true) {}
  4243. </pre></td></tr>
  4244. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
  4245. <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
  4246. matches InnerMatcher if the qualifier exists.
  4247. Given
  4248. namespace N {
  4249. namespace M {
  4250. class D {};
  4251. }
  4252. }
  4253. N::M::D d;
  4254. elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
  4255. matches the type of the variable declaration of d.
  4256. </pre></td></tr>
  4257. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4258. <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
  4259. Given
  4260. namespace N {
  4261. namespace M {
  4262. class D {};
  4263. }
  4264. }
  4265. N::M::D d;
  4266. elaboratedType(namesType(recordType(
  4267. hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
  4268. declaration of d.
  4269. </pre></td></tr>
  4270. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4271. <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
  4272. matches the given matcher.
  4273. The associated declaration is:
  4274. - for type nodes, the declaration of the underlying type
  4275. - for CallExpr, the declaration of the callee
  4276. - for MemberExpr, the declaration of the referenced member
  4277. - for CXXConstructExpr, the declaration of the constructor
  4278. - for CXXNewExpr, the declaration of the operator new
  4279. - for ObjCIvarExpr, the declaration of the ivar
  4280. For type nodes, hasDeclaration will generally match the declaration of the
  4281. sugared type. Given
  4282. class X {};
  4283. typedef X Y;
  4284. Y y;
  4285. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4286. typedefDecl. A common use case is to match the underlying, desugared type.
  4287. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4288. varDecl(hasType(hasUnqualifiedDesugaredType(
  4289. recordType(hasDeclaration(decl())))))
  4290. In this matcher, the decl will match the CXXRecordDecl of class X.
  4291. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4292. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4293. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4294. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4295. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4296. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4297. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4298. </pre></td></tr>
  4299. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4300. <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
  4301. (Note: Clang's AST refers to other conversions as "casts" too, and calls
  4302. actual casts "explicit" casts.)
  4303. </pre></td></tr>
  4304. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4305. <tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
  4306. declaration's type.
  4307. In case of a value declaration (for example a variable declaration),
  4308. this resolves one layer of indirection. For example, in the value
  4309. declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
  4310. X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
  4311. declaration of x.
  4312. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  4313. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  4314. and friend class X (matcher = friendDecl(hasType("X"))
  4315. class X {};
  4316. void y(X &amp;x) { x; X z; }
  4317. class Y { friend class X; };
  4318. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
  4319. </pre></td></tr>
  4320. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4321. <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
  4322. matcher.
  4323. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  4324. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  4325. and U (matcher = typedefDecl(hasType(asString("int")))
  4326. and friend class X (matcher = friendDecl(hasType("X"))
  4327. class X {};
  4328. void y(X &amp;x) { x; X z; }
  4329. typedef int U;
  4330. class Y { friend class X; };
  4331. </pre></td></tr>
  4332. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4333. <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
  4334. elidable constructor and other corresponding bookkeeping nodes.
  4335. In C++17, elidable copy constructors are no longer being generated in the
  4336. AST as it is not permitted by the standard. They are, however, part of the
  4337. AST in C++14 and earlier. So, a matcher must abstract over these differences
  4338. to work in all language modes. This matcher skips elidable constructor-call
  4339. AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
  4340. various implicit nodes inside the constructor calls, all of which will not
  4341. appear in the C++17 AST.
  4342. Given
  4343. struct H {};
  4344. H G();
  4345. void f() {
  4346. H D = G();
  4347. }
  4348. ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
  4349. matches ``H D = G()`` in C++11 through C++17 (and beyond).
  4350. </pre></td></tr>
  4351. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4352. <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
  4353. are stripped off.
  4354. Parentheses and explicit casts are not discarded.
  4355. Given
  4356. int arr[5];
  4357. int a = 0;
  4358. char b = 0;
  4359. const int c = a;
  4360. int *d = arr;
  4361. long e = (long) 0l;
  4362. The matchers
  4363. varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
  4364. varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
  4365. would match the declarations for a, b, c, and d, but not e.
  4366. While
  4367. varDecl(hasInitializer(integerLiteral()))
  4368. varDecl(hasInitializer(declRefExpr()))
  4369. only match the declarations for b, c, and d.
  4370. </pre></td></tr>
  4371. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4372. <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
  4373. nodes are stripped off.
  4374. Parentheses and explicit casts are not discarded.
  4375. Given
  4376. class C {};
  4377. C a = C();
  4378. C b;
  4379. C c = b;
  4380. The matchers
  4381. varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
  4382. would match the declarations for a, b, and c.
  4383. While
  4384. varDecl(hasInitializer(cxxConstructExpr()))
  4385. only match the declarations for b and c.
  4386. </pre></td></tr>
  4387. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4388. <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
  4389. casts are stripped off.
  4390. Implicit and non-C Style casts are also discarded.
  4391. Given
  4392. int a = 0;
  4393. char b = (0);
  4394. void* c = reinterpret_cast&lt;char*&gt;(0);
  4395. char d = char(0);
  4396. The matcher
  4397. varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
  4398. would match the declarations for a, b, c, and d.
  4399. while
  4400. varDecl(hasInitializer(integerLiteral()))
  4401. only match the declaration for a.
  4402. </pre></td></tr>
  4403. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4404. <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
  4405. parentheses are stripped off.
  4406. Explicit casts are not discarded.
  4407. Given
  4408. int arr[5];
  4409. int a = 0;
  4410. char b = (0);
  4411. const int c = a;
  4412. int *d = (arr);
  4413. long e = ((long) 0l);
  4414. The matchers
  4415. varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
  4416. varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
  4417. would match the declarations for a, b, c, and d, but not e.
  4418. while
  4419. varDecl(hasInitializer(integerLiteral()))
  4420. varDecl(hasInitializer(declRefExpr()))
  4421. would only match the declaration for a.
  4422. </pre></td></tr>
  4423. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4424. <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
  4425. Given
  4426. const char* str = ("my-string");
  4427. The matcher
  4428. implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
  4429. would match the implicit cast resulting from the assignment.
  4430. </pre></td></tr>
  4431. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4432. <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
  4433. Given
  4434. class C {
  4435. int a = 2;
  4436. int b = 3;
  4437. int c;
  4438. };
  4439. fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
  4440. matches 'int a;' but not 'int b;'.
  4441. fieldDecl(hasInClassInitializer(anything()))
  4442. matches 'int a;' and 'int b;' but not 'int c;'.
  4443. </pre></td></tr>
  4444. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4445. <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
  4446. definition that has a given body.
  4447. Given
  4448. for (;;) {}
  4449. hasBody(compoundStmt())
  4450. matches 'for (;;) {}'
  4451. with compoundStmt()
  4452. matching '{}'
  4453. </pre></td></tr>
  4454. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4455. <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
  4456. switch statement or conditional operator.
  4457. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  4458. if (true) {}
  4459. </pre></td></tr>
  4460. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4461. <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
  4462. Example:
  4463. forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
  4464. matches '++x' in
  4465. for (x; x &lt; N; ++x) { }
  4466. </pre></td></tr>
  4467. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4468. <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
  4469. Example:
  4470. forStmt(hasLoopInit(declStmt()))
  4471. matches 'int x = 0' in
  4472. for (int x = 0; x &lt; N; ++x) { }
  4473. </pre></td></tr>
  4474. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4475. <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
  4476. declaration's type.
  4477. In case of a value declaration (for example a variable declaration),
  4478. this resolves one layer of indirection. For example, in the value
  4479. declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
  4480. X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
  4481. declaration of x.
  4482. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  4483. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  4484. and friend class X (matcher = friendDecl(hasType("X"))
  4485. class X {};
  4486. void y(X &amp;x) { x; X z; }
  4487. class Y { friend class X; };
  4488. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
  4489. </pre></td></tr>
  4490. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4491. <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
  4492. matcher.
  4493. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  4494. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  4495. and U (matcher = typedefDecl(hasType(asString("int")))
  4496. and friend class X (matcher = friendDecl(hasType("X"))
  4497. class X {};
  4498. void y(X &amp;x) { x; X z; }
  4499. typedef int U;
  4500. class Y { friend class X; };
  4501. </pre></td></tr>
  4502. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  4503. <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
  4504. block.
  4505. Does not match the 'this' parameter of a method.
  4506. Given
  4507. class X { void f(int x, int y, int z) {} };
  4508. cxxMethodDecl(hasAnyParameter(hasName("y")))
  4509. matches f(int x, int y, int z) {}
  4510. with hasAnyParameter(...)
  4511. matching int y
  4512. For ObjectiveC, given
  4513. @interface I - (void) f:(int) y; @end
  4514. the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
  4515. matches the declaration of method f with hasParameter
  4516. matching y.
  4517. For blocks, given
  4518. b = ^(int y) { printf("%d", y) };
  4519. the matcher blockDecl(hasAnyParameter(hasName("y")))
  4520. matches the declaration of the block b with hasParameter
  4521. matching y.
  4522. </pre></td></tr>
  4523. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  4524. <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  4525. functionDecl that have at least one TemplateArgument matching the given
  4526. InnerMatcher.
  4527. Given
  4528. template&lt;typename T&gt; class A {};
  4529. template&lt;&gt; class A&lt;double&gt; {};
  4530. A&lt;int&gt; a;
  4531. template&lt;typename T&gt; f() {};
  4532. void func() { f&lt;int&gt;(); };
  4533. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  4534. refersToType(asString("int"))))
  4535. matches the specialization A&lt;int&gt;
  4536. functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
  4537. matches the specialization f&lt;int&gt;
  4538. </pre></td></tr>
  4539. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4540. <tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
  4541. definition that has a given body.
  4542. Given
  4543. for (;;) {}
  4544. hasBody(compoundStmt())
  4545. matches 'for (;;) {}'
  4546. with compoundStmt()
  4547. matching '{}'
  4548. </pre></td></tr>
  4549. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4550. <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
  4551. declaration.
  4552. Given
  4553. template&lt;bool b&gt;
  4554. struct S {
  4555. S(int); // #1
  4556. explicit S(double); // #2
  4557. operator int(); // #3
  4558. explicit operator bool(); // #4
  4559. explicit(false) S(bool) // # 7
  4560. explicit(true) S(char) // # 8
  4561. explicit(b) S(S) // # 9
  4562. };
  4563. S(int) -&gt; S&lt;true&gt; // #5
  4564. explicit S(double) -&gt; S&lt;false&gt; // #6
  4565. cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
  4566. cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
  4567. cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
  4568. </pre></td></tr>
  4569. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  4570. <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
  4571. declaration or a block.
  4572. Given
  4573. class X { void f(int x) {} };
  4574. cxxMethodDecl(hasParameter(0, hasType(varDecl())))
  4575. matches f(int x) {}
  4576. with hasParameter(...)
  4577. matching int x
  4578. For ObjectiveC, given
  4579. @interface I - (void) f:(int) y; @end
  4580. the matcher objcMethodDecl(hasParameter(0, hasName("y")))
  4581. matches the declaration of method f with hasParameter
  4582. matching y.
  4583. </pre></td></tr>
  4584. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  4585. <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  4586. functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
  4587. Given
  4588. template&lt;typename T, typename U&gt; class A {};
  4589. A&lt;bool, int&gt; b;
  4590. A&lt;int, bool&gt; c;
  4591. template&lt;typename T&gt; void f() {}
  4592. void func() { f&lt;int&gt;(); };
  4593. classTemplateSpecializationDecl(hasTemplateArgument(
  4594. 1, refersToType(asString("int"))))
  4595. matches the specialization A&lt;bool, int&gt;
  4596. functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
  4597. matches the specialization f&lt;int&gt;
  4598. </pre></td></tr>
  4599. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4600. <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
  4601. Given:
  4602. class X { int f() { return 1; } };
  4603. cxxMethodDecl(returns(asString("int")))
  4604. matches int f() { return 1; }
  4605. </pre></td></tr>
  4606. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4607. <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
  4608. switch statement or conditional operator.
  4609. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  4610. if (true) {}
  4611. </pre></td></tr>
  4612. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
  4613. <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
  4614. Given
  4615. if (A* a = GetAPointer()) {}
  4616. hasConditionVariableStatement(...)
  4617. matches 'A* a = GetAPointer()'.
  4618. </pre></td></tr>
  4619. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4620. <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
  4621. Examples matches the if statement
  4622. (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
  4623. if (false) false; else true;
  4624. </pre></td></tr>
  4625. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4626. <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
  4627. Examples matches the if statement
  4628. (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
  4629. if (false) true; else false;
  4630. </pre></td></tr>
  4631. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4632. <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
  4633. matcher.
  4634. FIXME: Unit test this matcher
  4635. </pre></td></tr>
  4636. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4637. <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
  4638. Example matches y.
  4639. (matcher = initListExpr(hasInit(0, expr())))
  4640. int x{y}.
  4641. </pre></td></tr>
  4642. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4643. <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
  4644. (if expression have it).
  4645. </pre></td></tr>
  4646. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4647. <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
  4648. matches the given matcher.
  4649. The associated declaration is:
  4650. - for type nodes, the declaration of the underlying type
  4651. - for CallExpr, the declaration of the callee
  4652. - for MemberExpr, the declaration of the referenced member
  4653. - for CXXConstructExpr, the declaration of the constructor
  4654. - for CXXNewExpr, the declaration of the operator new
  4655. - for ObjCIvarExpr, the declaration of the ivar
  4656. For type nodes, hasDeclaration will generally match the declaration of the
  4657. sugared type. Given
  4658. class X {};
  4659. typedef X Y;
  4660. Y y;
  4661. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4662. typedefDecl. A common use case is to match the underlying, desugared type.
  4663. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4664. varDecl(hasType(hasUnqualifiedDesugaredType(
  4665. recordType(hasDeclaration(decl())))))
  4666. In this matcher, the decl will match the CXXRecordDecl of class X.
  4667. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4668. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4669. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4670. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4671. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4672. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4673. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4674. </pre></td></tr>
  4675. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4676. <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
  4677. matches the given matcher.
  4678. The associated declaration is:
  4679. - for type nodes, the declaration of the underlying type
  4680. - for CallExpr, the declaration of the callee
  4681. - for MemberExpr, the declaration of the referenced member
  4682. - for CXXConstructExpr, the declaration of the constructor
  4683. - for CXXNewExpr, the declaration of the operator new
  4684. - for ObjCIvarExpr, the declaration of the ivar
  4685. For type nodes, hasDeclaration will generally match the declaration of the
  4686. sugared type. Given
  4687. class X {};
  4688. typedef X Y;
  4689. Y y;
  4690. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4691. typedefDecl. A common use case is to match the underlying, desugared type.
  4692. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4693. varDecl(hasType(hasUnqualifiedDesugaredType(
  4694. recordType(hasDeclaration(decl())))))
  4695. In this matcher, the decl will match the CXXRecordDecl of class X.
  4696. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4697. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4698. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4699. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4700. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4701. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4702. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4703. </pre></td></tr>
  4704. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4705. <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
  4706. matches the given matcher.
  4707. The associated declaration is:
  4708. - for type nodes, the declaration of the underlying type
  4709. - for CallExpr, the declaration of the callee
  4710. - for MemberExpr, the declaration of the referenced member
  4711. - for CXXConstructExpr, the declaration of the constructor
  4712. - for CXXNewExpr, the declaration of the operator new
  4713. - for ObjCIvarExpr, the declaration of the ivar
  4714. For type nodes, hasDeclaration will generally match the declaration of the
  4715. sugared type. Given
  4716. class X {};
  4717. typedef X Y;
  4718. Y y;
  4719. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  4720. typedefDecl. A common use case is to match the underlying, desugared type.
  4721. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  4722. varDecl(hasType(hasUnqualifiedDesugaredType(
  4723. recordType(hasDeclaration(decl())))))
  4724. In this matcher, the decl will match the CXXRecordDecl of class X.
  4725. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  4726. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  4727. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  4728. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  4729. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  4730. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  4731. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  4732. </pre></td></tr>
  4733. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4734. <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
  4735. given matcher. Implicit object expressions are included; that is, it matches
  4736. use of implicit `this`.
  4737. Given
  4738. struct X {
  4739. int m;
  4740. int f(X x) { x.m; return m; }
  4741. };
  4742. memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
  4743. matches `x.m`, but not `m`; however,
  4744. memberExpr(hasObjectExpression(hasType(pointsTo(
  4745. cxxRecordDecl(hasName("X"))))))
  4746. matches `m` (aka. `this-&gt;m`), but not `x.m`.
  4747. </pre></td></tr>
  4748. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
  4749. <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
  4750. given matcher.
  4751. Given
  4752. struct { int first, second; } first, second;
  4753. int i(second.first);
  4754. int j(first.second);
  4755. memberExpr(member(hasName("first")))
  4756. matches second.first
  4757. but not first.second (because the member name there is "second").
  4758. </pre></td></tr>
  4759. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  4760. <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
  4761. pointee matches a given matcher.
  4762. Given
  4763. int *a;
  4764. int const *b;
  4765. float const *f;
  4766. pointerType(pointee(isConstQualified(), isInteger()))
  4767. matches "int const *b"
  4768. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
  4769. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
  4770. </pre></td></tr>
  4771. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
  4772. <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
  4773. matcher.
  4774. Given
  4775. namespace N { template&lt;class T&gt; void f(T t); }
  4776. template &lt;class T&gt; void g() { using N::f; f(T()); }
  4777. unresolvedLookupExpr(hasAnyDeclaration(
  4778. namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
  4779. matches the use of f in g() .
  4780. </pre></td></tr>
  4781. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
  4782. <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
  4783. Given
  4784. struct A { struct B { struct C {}; }; };
  4785. A::B::C c;
  4786. nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
  4787. matches "A::"
  4788. </pre></td></tr>
  4789. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
  4790. <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
  4791. given TypeLoc.
  4792. Given
  4793. struct A { struct B { struct C {}; }; };
  4794. A::B::C c;
  4795. nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
  4796. hasDeclaration(cxxRecordDecl(hasName("A")))))))
  4797. matches "A::"
  4798. </pre></td></tr>
  4799. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
  4800. <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
  4801. Given
  4802. struct A { struct B { struct C {}; }; };
  4803. A::B::C c;
  4804. nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
  4805. matches "A::"
  4806. </pre></td></tr>
  4807. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
  4808. <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
  4809. given namespace matcher.
  4810. Given
  4811. namespace ns { struct A {}; }
  4812. ns::A a;
  4813. nestedNameSpecifier(specifiesNamespace(hasName("ns")))
  4814. matches "ns::"
  4815. </pre></td></tr>
  4816. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4817. <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
  4818. given QualType matcher without qualifiers.
  4819. Given
  4820. struct A { struct B { struct C {}; }; };
  4821. A::B::C c;
  4822. nestedNameSpecifier(specifiesType(
  4823. hasDeclaration(cxxRecordDecl(hasName("A")))
  4824. ))
  4825. matches "A::"
  4826. </pre></td></tr>
  4827. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt; InnerMatcher</td></tr>
  4828. <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
  4829. Given
  4830. #pragma omp parallel
  4831. #pragma omp parallel default(none)
  4832. ``ompExecutableDirective(hasAnyClause(anything()))`` matches
  4833. ``omp parallel default(none)``.
  4834. </pre></td></tr>
  4835. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  4836. <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
  4837. Prerequisite: the executable directive must not be standalone directive.
  4838. If it is, it will never match.
  4839. Given
  4840. #pragma omp parallel
  4841. ;
  4842. #pragma omp parallel
  4843. {}
  4844. ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
  4845. </pre></td></tr>
  4846. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  4847. <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
  4848. matching Base, or Objective-C classes that directly or indirectly
  4849. subclass a class matching Base.
  4850. Note that a class is not considered to be derived from itself.
  4851. Example matches Y, Z, C (Base == hasName("X"))
  4852. class X;
  4853. class Y : public X {}; // directly derived
  4854. class Z : public Y {}; // indirectly derived
  4855. typedef X A;
  4856. typedef A B;
  4857. class C : public B {}; // derived from a typedef of X
  4858. In the following example, Bar matches isDerivedFrom(hasName("X")):
  4859. class Foo;
  4860. typedef Foo X;
  4861. class Bar : public Foo {}; // derived from a type that X is a typedef of
  4862. In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
  4863. @interface NSObject @end
  4864. @interface Bar : NSObject @end
  4865. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
  4866. </pre></td></tr>
  4867. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  4868. <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
  4869. matching Base.
  4870. Note that a class is not considered to be derived from itself.
  4871. Example matches Y, C (Base == hasName("X"))
  4872. class X;
  4873. class Y : public X {}; // directly derived
  4874. class Z : public Y {}; // indirectly derived
  4875. typedef X A;
  4876. typedef A B;
  4877. class C : public B {}; // derived from a typedef of X
  4878. In the following example, Bar matches isDerivedFrom(hasName("X")):
  4879. class Foo;
  4880. typedef Foo X;
  4881. class Bar : public Foo {}; // derived from a type that X is a typedef of
  4882. </pre></td></tr>
  4883. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
  4884. <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
  4885. match Base.
  4886. </pre></td></tr>
  4887. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4888. <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
  4889. expression, or an ObjC-message-send expression.
  4890. Given
  4891. void x(int, int, int) { int y; x(1, y, 42); }
  4892. callExpr(hasAnyArgument(declRefExpr()))
  4893. matches x(1, y, 42)
  4894. with hasAnyArgument(...)
  4895. matching y
  4896. For ObjectiveC, given
  4897. @interface I - (void) f:(int) y; @end
  4898. void foo(I *i) { [i f:12]; }
  4899. objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
  4900. matches [i f:12]
  4901. </pre></td></tr>
  4902. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4903. <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
  4904. call expression.
  4905. Example matches y in x(y)
  4906. (matcher = callExpr(hasArgument(0, declRefExpr())))
  4907. void x(int) { int y; x(y); }
  4908. </pre></td></tr>
  4909. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4910. <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
  4911. and the inner matcher matches on that instance.
  4912. For example the method call in
  4913. NSString *x = @"hello";
  4914. [x containsString:@"h"];
  4915. is matched by
  4916. objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
  4917. </pre></td></tr>
  4918. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  4919. <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
  4920. Example
  4921. matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
  4922. matches the [webView ...] message invocation.
  4923. NSString *webViewJavaScript = ...
  4924. UIWebView *webView = ...
  4925. [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
  4926. </pre></td></tr>
  4927. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  4928. <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
  4929. block.
  4930. Does not match the 'this' parameter of a method.
  4931. Given
  4932. class X { void f(int x, int y, int z) {} };
  4933. cxxMethodDecl(hasAnyParameter(hasName("y")))
  4934. matches f(int x, int y, int z) {}
  4935. with hasAnyParameter(...)
  4936. matching int y
  4937. For ObjectiveC, given
  4938. @interface I - (void) f:(int) y; @end
  4939. the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
  4940. matches the declaration of method f with hasParameter
  4941. matching y.
  4942. For blocks, given
  4943. b = ^(int y) { printf("%d", y) };
  4944. the matcher blockDecl(hasAnyParameter(hasName("y")))
  4945. matches the declaration of the block b with hasParameter
  4946. matching y.
  4947. </pre></td></tr>
  4948. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
  4949. <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
  4950. declaration or a block.
  4951. Given
  4952. class X { void f(int x) {} };
  4953. cxxMethodDecl(hasParameter(0, hasType(varDecl())))
  4954. matches f(int x) {}
  4955. with hasParameter(...)
  4956. matching int x
  4957. For ObjectiveC, given
  4958. @interface I - (void) f:(int) y; @end
  4959. the matcher objcMethodDecl(hasParameter(0, hasName("y")))
  4960. matches the declaration of method f with hasParameter
  4961. matching y.
  4962. </pre></td></tr>
  4963. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  4964. <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
  4965. or opaque value's source expression matches the given matcher.
  4966. Example 1: matches "a string"
  4967. (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
  4968. class URL { URL(string); };
  4969. URL url = "a string";
  4970. Example 2: matches 'b' (matcher =
  4971. opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
  4972. int a = b ?: 1;
  4973. </pre></td></tr>
  4974. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  4975. <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
  4976. overloads matches the given matcher.
  4977. Given
  4978. template &lt;typename T&gt; void foo(T);
  4979. template &lt;typename T&gt; void bar(T);
  4980. template &lt;typename T&gt; void baz(T t) {
  4981. foo(t);
  4982. bar(t);
  4983. }
  4984. unresolvedLookupExpr(hasAnyDeclaration(
  4985. functionTemplateDecl(hasName("foo"))))
  4986. matches foo in foo(t); but not bar in bar(t);
  4987. </pre></td></tr>
  4988. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  4989. <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
  4990. Given
  4991. int (*ptr_to_array)[4];
  4992. int (*ptr_to_func)(int);
  4993. varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
  4994. ptr_to_func but not ptr_to_array.
  4995. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
  4996. </pre></td></tr>
  4997. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  4998. <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
  4999. pointee matches a given matcher.
  5000. Given
  5001. int *a;
  5002. int const *b;
  5003. float const *f;
  5004. pointerType(pointee(isConstQualified(), isInteger()))
  5005. matches "int const *b"
  5006. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
  5007. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
  5008. </pre></td></tr>
  5009. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5010. <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
  5011. Given:
  5012. typedef int &amp;int_ref;
  5013. int a;
  5014. int_ref b = a;
  5015. varDecl(hasType(qualType(referenceType()))))) will not match the
  5016. declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
  5017. </pre></td></tr>
  5018. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5019. <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
  5020. matches the given matcher.
  5021. The associated declaration is:
  5022. - for type nodes, the declaration of the underlying type
  5023. - for CallExpr, the declaration of the callee
  5024. - for MemberExpr, the declaration of the referenced member
  5025. - for CXXConstructExpr, the declaration of the constructor
  5026. - for CXXNewExpr, the declaration of the operator new
  5027. - for ObjCIvarExpr, the declaration of the ivar
  5028. For type nodes, hasDeclaration will generally match the declaration of the
  5029. sugared type. Given
  5030. class X {};
  5031. typedef X Y;
  5032. Y y;
  5033. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5034. typedefDecl. A common use case is to match the underlying, desugared type.
  5035. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5036. varDecl(hasType(hasUnqualifiedDesugaredType(
  5037. recordType(hasDeclaration(decl())))))
  5038. In this matcher, the decl will match the CXXRecordDecl of class X.
  5039. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5040. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5041. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5042. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5043. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5044. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5045. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5046. </pre></td></tr>
  5047. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5048. <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
  5049. Given
  5050. void (*fp)(void);
  5051. The matcher
  5052. varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
  5053. would match the declaration for fp.
  5054. </pre></td></tr>
  5055. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5056. <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
  5057. </pre></td></tr>
  5058. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5059. <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
  5060. matches the specified matcher.
  5061. Example matches y-&gt;x()
  5062. (matcher = cxxMemberCallExpr(on(hasType(pointsTo
  5063. cxxRecordDecl(hasName("Y")))))))
  5064. class Y { public: void x(); };
  5065. void z() { Y *y; y-&gt;x(); }
  5066. </pre></td></tr>
  5067. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5068. <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
  5069. </pre></td></tr>
  5070. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5071. <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
  5072. type matches the specified matcher.
  5073. Example matches X &amp;x and const X &amp;y
  5074. (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
  5075. class X {
  5076. void a(X b) {
  5077. X &amp;x = b;
  5078. const X &amp;y = b;
  5079. }
  5080. };
  5081. </pre></td></tr>
  5082. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5083. <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
  5084. matches the given matcher.
  5085. The associated declaration is:
  5086. - for type nodes, the declaration of the underlying type
  5087. - for CallExpr, the declaration of the callee
  5088. - for MemberExpr, the declaration of the referenced member
  5089. - for CXXConstructExpr, the declaration of the constructor
  5090. - for CXXNewExpr, the declaration of the operator new
  5091. - for ObjCIvarExpr, the declaration of the ivar
  5092. For type nodes, hasDeclaration will generally match the declaration of the
  5093. sugared type. Given
  5094. class X {};
  5095. typedef X Y;
  5096. Y y;
  5097. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5098. typedefDecl. A common use case is to match the underlying, desugared type.
  5099. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5100. varDecl(hasType(hasUnqualifiedDesugaredType(
  5101. recordType(hasDeclaration(decl())))))
  5102. In this matcher, the decl will match the CXXRecordDecl of class X.
  5103. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5104. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5105. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5106. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5107. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5108. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5109. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5110. </pre></td></tr>
  5111. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  5112. <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
  5113. pointee matches a given matcher.
  5114. Given
  5115. int *a;
  5116. int const *b;
  5117. float const *f;
  5118. pointerType(pointee(isConstQualified(), isInteger()))
  5119. matches "int const *b"
  5120. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
  5121. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
  5122. </pre></td></tr>
  5123. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5124. <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
  5125. Given
  5126. return a + b;
  5127. hasReturnValue(binaryOperator())
  5128. matches 'return a + b'
  5129. with binaryOperator()
  5130. matching 'a + b'
  5131. </pre></td></tr>
  5132. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  5133. <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
  5134. a given matcher. Also matches StmtExprs that have CompoundStmt as children.
  5135. Given
  5136. { {}; 1+2; }
  5137. hasAnySubstatement(compoundStmt())
  5138. matches '{ {}; 1+2; }'
  5139. with compoundStmt()
  5140. matching '{}'
  5141. </pre></td></tr>
  5142. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
  5143. <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
  5144. alignof.
  5145. </pre></td></tr>
  5146. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
  5147. <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
  5148. Given:
  5149. F&amp; operator=(const F&amp; o) {
  5150. std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
  5151. return *this;
  5152. }
  5153. returnStmt(forFunction(hasName("operator=")))
  5154. matches 'return *this'
  5155. but does not match 'return v &gt; 0'
  5156. </pre></td></tr>
  5157. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
  5158. <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
  5159. sizeof.
  5160. </pre></td></tr>
  5161. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
  5162. <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
  5163. type that matches the provided matcher.
  5164. Given
  5165. template &lt;typename T&gt;
  5166. double F(T t);
  5167. int i;
  5168. double j = F(i);
  5169. substTemplateTypeParmType(hasReplacementType(type())) matches int
  5170. </pre></td></tr>
  5171. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
  5172. <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
  5173. statement. This matcher may produce multiple matches.
  5174. Given
  5175. switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
  5176. switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
  5177. matches four times, with "c" binding each of "case 1:", "case 2:",
  5178. "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
  5179. "switch (1)", "switch (2)" and "switch (2)".
  5180. </pre></td></tr>
  5181. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5182. <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
  5183. switch statement or conditional operator.
  5184. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  5185. if (true) {}
  5186. </pre></td></tr>
  5187. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5188. <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
  5189. matches the given matcher.
  5190. The associated declaration is:
  5191. - for type nodes, the declaration of the underlying type
  5192. - for CallExpr, the declaration of the callee
  5193. - for MemberExpr, the declaration of the referenced member
  5194. - for CXXConstructExpr, the declaration of the constructor
  5195. - for CXXNewExpr, the declaration of the operator new
  5196. - for ObjCIvarExpr, the declaration of the ivar
  5197. For type nodes, hasDeclaration will generally match the declaration of the
  5198. sugared type. Given
  5199. class X {};
  5200. typedef X Y;
  5201. Y y;
  5202. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5203. typedefDecl. A common use case is to match the underlying, desugared type.
  5204. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5205. varDecl(hasType(hasUnqualifiedDesugaredType(
  5206. recordType(hasDeclaration(decl())))))
  5207. In this matcher, the decl will match the CXXRecordDecl of class X.
  5208. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5209. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5210. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5211. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5212. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5213. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5214. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5215. </pre></td></tr>
  5216. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5217. <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
  5218. Given
  5219. struct B { int next; };
  5220. template&lt;int(B::*next_ptr)&gt; struct A {};
  5221. A&lt;&amp;B::next&gt; a;
  5222. templateSpecializationType(hasAnyTemplateArgument(
  5223. isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
  5224. matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
  5225. B::next
  5226. </pre></td></tr>
  5227. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5228. <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
  5229. declaration.
  5230. Given
  5231. struct B { int next; };
  5232. template&lt;int(B::*next_ptr)&gt; struct A {};
  5233. A&lt;&amp;B::next&gt; a;
  5234. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  5235. refersToDeclaration(fieldDecl(hasName("next")))))
  5236. matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
  5237. B::next
  5238. </pre></td></tr>
  5239. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5240. <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
  5241. Given
  5242. template&lt;int T&gt; struct C {};
  5243. C&lt;42&gt; c;
  5244. classTemplateSpecializationDecl(
  5245. hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
  5246. matches the implicit instantiation of C in C&lt;42&gt;.
  5247. </pre></td></tr>
  5248. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
  5249. <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
  5250. Given
  5251. template&lt;template &lt;typename&gt; class S&gt; class X {};
  5252. template&lt;typename T&gt; class Y {};
  5253. X&lt;Y&gt; xi;
  5254. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  5255. refersToTemplate(templateName())))
  5256. matches the specialization X&lt;Y&gt;
  5257. </pre></td></tr>
  5258. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5259. <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
  5260. Given
  5261. struct X {};
  5262. template&lt;typename T&gt; struct A {};
  5263. A&lt;X&gt; a;
  5264. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  5265. refersToType(class(hasName("X")))))
  5266. matches the specialization A&lt;X&gt;
  5267. </pre></td></tr>
  5268. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  5269. <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  5270. functionDecl that have at least one TemplateArgument matching the given
  5271. InnerMatcher.
  5272. Given
  5273. template&lt;typename T&gt; class A {};
  5274. template&lt;&gt; class A&lt;double&gt; {};
  5275. A&lt;int&gt; a;
  5276. template&lt;typename T&gt; f() {};
  5277. void func() { f&lt;int&gt;(); };
  5278. classTemplateSpecializationDecl(hasAnyTemplateArgument(
  5279. refersToType(asString("int"))))
  5280. matches the specialization A&lt;int&gt;
  5281. functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
  5282. matches the specialization f&lt;int&gt;
  5283. </pre></td></tr>
  5284. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5285. <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
  5286. matches the given matcher.
  5287. The associated declaration is:
  5288. - for type nodes, the declaration of the underlying type
  5289. - for CallExpr, the declaration of the callee
  5290. - for MemberExpr, the declaration of the referenced member
  5291. - for CXXConstructExpr, the declaration of the constructor
  5292. - for CXXNewExpr, the declaration of the operator new
  5293. - for ObjCIvarExpr, the declaration of the ivar
  5294. For type nodes, hasDeclaration will generally match the declaration of the
  5295. sugared type. Given
  5296. class X {};
  5297. typedef X Y;
  5298. Y y;
  5299. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5300. typedefDecl. A common use case is to match the underlying, desugared type.
  5301. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5302. varDecl(hasType(hasUnqualifiedDesugaredType(
  5303. recordType(hasDeclaration(decl())))))
  5304. In this matcher, the decl will match the CXXRecordDecl of class X.
  5305. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5306. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5307. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5308. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5309. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5310. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5311. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5312. </pre></td></tr>
  5313. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
  5314. <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
  5315. functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
  5316. Given
  5317. template&lt;typename T, typename U&gt; class A {};
  5318. A&lt;bool, int&gt; b;
  5319. A&lt;int, bool&gt; c;
  5320. template&lt;typename T&gt; void f() {}
  5321. void func() { f&lt;int&gt;(); };
  5322. classTemplateSpecializationDecl(hasTemplateArgument(
  5323. 1, refersToType(asString("int"))))
  5324. matches the specialization A&lt;bool, int&gt;
  5325. functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
  5326. matches the specialization f&lt;int&gt;
  5327. </pre></td></tr>
  5328. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5329. <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
  5330. matches the given matcher.
  5331. The associated declaration is:
  5332. - for type nodes, the declaration of the underlying type
  5333. - for CallExpr, the declaration of the callee
  5334. - for MemberExpr, the declaration of the referenced member
  5335. - for CXXConstructExpr, the declaration of the constructor
  5336. - for CXXNewExpr, the declaration of the operator new
  5337. - for ObjCIvarExpr, the declaration of the ivar
  5338. For type nodes, hasDeclaration will generally match the declaration of the
  5339. sugared type. Given
  5340. class X {};
  5341. typedef X Y;
  5342. Y y;
  5343. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5344. typedefDecl. A common use case is to match the underlying, desugared type.
  5345. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5346. varDecl(hasType(hasUnqualifiedDesugaredType(
  5347. recordType(hasDeclaration(decl())))))
  5348. In this matcher, the decl will match the CXXRecordDecl of class X.
  5349. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5350. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5351. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5352. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5353. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5354. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5355. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5356. </pre></td></tr>
  5357. <tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt; Matcher</td></tr>
  5358. <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
  5359. Generates results for each match.
  5360. For example, in:
  5361. class A { class B {}; class C {}; };
  5362. The matcher:
  5363. cxxRecordDecl(hasName("::A"),
  5364. findAll(cxxRecordDecl(isDefinition()).bind("m")))
  5365. will generate results for A, B and C.
  5366. Usable as: Any Matcher
  5367. </pre></td></tr>
  5368. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5369. <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
  5370. matcher.
  5371. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  5372. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  5373. and U (matcher = typedefDecl(hasType(asString("int")))
  5374. and friend class X (matcher = friendDecl(hasType("X"))
  5375. class X {};
  5376. void y(X &amp;x) { x; X z; }
  5377. typedef int U;
  5378. class Y { friend class X; };
  5379. </pre></td></tr>
  5380. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5381. <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
  5382. matches the given matcher.
  5383. The associated declaration is:
  5384. - for type nodes, the declaration of the underlying type
  5385. - for CallExpr, the declaration of the callee
  5386. - for MemberExpr, the declaration of the referenced member
  5387. - for CXXConstructExpr, the declaration of the constructor
  5388. - for CXXNewExpr, the declaration of the operator new
  5389. - for ObjCIvarExpr, the declaration of the ivar
  5390. For type nodes, hasDeclaration will generally match the declaration of the
  5391. sugared type. Given
  5392. class X {};
  5393. typedef X Y;
  5394. Y y;
  5395. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5396. typedefDecl. A common use case is to match the underlying, desugared type.
  5397. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5398. varDecl(hasType(hasUnqualifiedDesugaredType(
  5399. recordType(hasDeclaration(decl())))))
  5400. In this matcher, the decl will match the CXXRecordDecl of class X.
  5401. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5402. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5403. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5404. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5405. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5406. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5407. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5408. </pre></td></tr>
  5409. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
  5410. <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
  5411. type of the matched node.
  5412. For example, in:
  5413. class A {};
  5414. using B = A;
  5415. The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
  5416. both B and A.
  5417. </pre></td></tr>
  5418. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5419. <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
  5420. Given
  5421. int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
  5422. unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
  5423. matches sizeof(a) and alignof(c)
  5424. </pre></td></tr>
  5425. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5426. <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
  5427. Example matches true (matcher = hasUnaryOperand(
  5428. cxxBoolLiteral(equals(true))))
  5429. !true
  5430. </pre></td></tr>
  5431. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5432. <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
  5433. given matcher. Implicit object expressions are included; that is, it matches
  5434. use of implicit `this`.
  5435. Given
  5436. struct X {
  5437. int m;
  5438. int f(X x) { x.m; return m; }
  5439. };
  5440. memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
  5441. matches `x.m`, but not `m`; however,
  5442. memberExpr(hasObjectExpression(hasType(pointsTo(
  5443. cxxRecordDecl(hasName("X"))))))
  5444. matches `m` (aka. `this-&gt;m`), but not `x.m`.
  5445. </pre></td></tr>
  5446. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5447. <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
  5448. matches the given matcher.
  5449. The associated declaration is:
  5450. - for type nodes, the declaration of the underlying type
  5451. - for CallExpr, the declaration of the callee
  5452. - for MemberExpr, the declaration of the referenced member
  5453. - for CXXConstructExpr, the declaration of the constructor
  5454. - for CXXNewExpr, the declaration of the operator new
  5455. - for ObjCIvarExpr, the declaration of the ivar
  5456. For type nodes, hasDeclaration will generally match the declaration of the
  5457. sugared type. Given
  5458. class X {};
  5459. typedef X Y;
  5460. Y y;
  5461. in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
  5462. typedefDecl. A common use case is to match the underlying, desugared type.
  5463. This can be achieved by using the hasUnqualifiedDesugaredType matcher:
  5464. varDecl(hasType(hasUnqualifiedDesugaredType(
  5465. recordType(hasDeclaration(decl())))))
  5466. In this matcher, the decl will match the CXXRecordDecl of class X.
  5467. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
  5468. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
  5469. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
  5470. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
  5471. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
  5472. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
  5473. Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
  5474. </pre></td></tr>
  5475. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
  5476. <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
  5477. Given
  5478. namespace X { void b(); }
  5479. using X::b;
  5480. usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
  5481. matches using X::b </pre></td></tr>
  5482. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt;</td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
  5483. <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
  5484. matched by the given matcher.
  5485. Given
  5486. namespace X { int a; void b(); }
  5487. using X::a;
  5488. using X::b;
  5489. usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
  5490. matches using X::b but not using X::a </pre></td></tr>
  5491. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
  5492. <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
  5493. declaration's type.
  5494. In case of a value declaration (for example a variable declaration),
  5495. this resolves one layer of indirection. For example, in the value
  5496. declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
  5497. X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
  5498. declaration of x.
  5499. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  5500. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  5501. and friend class X (matcher = friendDecl(hasType("X"))
  5502. class X {};
  5503. void y(X &amp;x) { x; X z; }
  5504. class Y { friend class X; };
  5505. Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
  5506. </pre></td></tr>
  5507. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5508. <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
  5509. matcher.
  5510. Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
  5511. and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
  5512. and U (matcher = typedefDecl(hasType(asString("int")))
  5513. and friend class X (matcher = friendDecl(hasType("X"))
  5514. class X {};
  5515. void y(X &amp;x) { x; X z; }
  5516. typedef int U;
  5517. class Y { friend class X; };
  5518. </pre></td></tr>
  5519. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5520. <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
  5521. that matches the given matcher.
  5522. Example matches x (matcher = varDecl(hasInitializer(callExpr())))
  5523. bool y() { return true; }
  5524. bool x = y();
  5525. </pre></td></tr>
  5526. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5527. <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
  5528. expression.
  5529. Given
  5530. void f(int b) {
  5531. int a[b];
  5532. }
  5533. variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
  5534. varDecl(hasName("b")))))))
  5535. matches "int a[b]"
  5536. </pre></td></tr>
  5537. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
  5538. <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
  5539. definition that has a given body.
  5540. Given
  5541. for (;;) {}
  5542. hasBody(compoundStmt())
  5543. matches 'for (;;) {}'
  5544. with compoundStmt()
  5545. matching '{}'
  5546. </pre></td></tr>
  5547. <tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
  5548. <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
  5549. switch statement or conditional operator.
  5550. Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
  5551. if (true) {}
  5552. </pre></td></tr>
  5553. <tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
  5554. <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
  5555. NestedNameSpecifier-matcher matches.
  5556. </pre></td></tr>
  5557. <tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
  5558. <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
  5559. QualType-matcher matches.
  5560. </pre></td></tr>
  5561. <!--END_TRAVERSAL_MATCHERS -->
  5562. </table>
  5563. </div>
  5564. </body>
  5565. </html>