From 49bf48eda167acc99f323e355c851c8286dcac96 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 19 Aug 2025 14:01:25 +0200 Subject: [PATCH] Rust: fix duplicate `asm!` expressions --- rust/ast-generator/src/main.rs | 1 + rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 8 ++-- rust/extractor/src/translate/base.rs | 32 +++++++++++++++ rust/extractor/src/translate/generated.rs | 18 --------- rust/ql/.generated.list | 14 +++---- .../internal/generated/CfgNodes.qll | 34 +++++++++------- .../codeql/rust/elements/MacroBlockExpr.qll | 10 ++++- .../elements/internal/MacroBlockExprImpl.qll | 10 ++++- .../internal/generated/MacroBlockExpr.qll | 40 +++++++++++-------- .../internal/generated/ParentChild.qll | 12 +++--- .../rust/elements/internal/generated/Raw.qll | 20 ++++++---- rust/ql/lib/rust.dbscheme | 12 +++--- .../generated/.generated_tests.list | 2 +- .../AsmClobberAbi/AsmClobberAbi.expected | 1 - .../generated/AsmConst/AsmConst.expected | 2 - .../generated/AsmDirSpec/AsmDirSpec.expected | 2 - .../generated/AsmLabel/AsmLabel.expected | 2 - .../AsmOperandExpr/AsmOperandExpr.expected | 6 --- .../AsmOperandNamed/AsmOperandNamed.expected | 5 --- .../generated/AsmOption/AsmOption.expected | 2 - .../AsmOptionsList/AsmOptionsList.expected | 3 -- .../AsmRegOperand/AsmRegOperand.expected | 8 ---- .../generated/AsmRegSpec/AsmRegSpec.expected | 3 -- .../generated/AsmSym/AsmSym.expected | 2 - .../MacroBlockExpr/MacroBlockExpr.expected | 8 ++-- .../MacroBlockExpr/MacroBlockExpr.ql | 8 ++-- .../MacroBlockExpr/gen_macro_block_expr.rs | 14 +++++-- rust/schema/annotations.py | 18 ++++++--- rust/schema/ast.py | 4 -- 30 files changed, 163 insertions(+), 140 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index d612985ff9f..e67152c3d0f 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -82,6 +82,7 @@ fn should_enum_be_skipped(name: &str) -> bool { fn should_node_be_skipped(name: &str) -> bool { name == "TypeAnchor" // we flatten TypeAnchor into PathSegment in the extractor + || name == "MacroStmts" // we workaround a getter bug in the extractor } fn should_node_be_skipped_in_extractor(name: &str) -> bool { diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 62fb59a50ca..1ac7818e6a2 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs a2b836f6f4c1332cdc2bcf7a4201765f22635f976892725aa424d7b306b6b586 a2b836f6f4c1332cdc2bcf7a4201765f22635f976892725aa424d7b306b6b586 +top.rs cf4f3f6b3fd0dee0d8b35f346695cfd3e080ca328ca1726ce851f6abfbabc631 cf4f3f6b3fd0dee0d8b35f346695cfd3e080ca328ca1726ce851f6abfbabc631 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index d8de082d024..806ee80d6ce 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -6148,8 +6148,8 @@ impl From> for trap::Label { #[derive(Debug)] pub struct MacroBlockExpr { pub id: trap::TrapId, - pub tail_expr: Option>, pub statements: Vec>, + pub tail_expr: Option>, } impl trap::TrapEntry for MacroBlockExpr { @@ -6159,12 +6159,12 @@ impl trap::TrapEntry for MacroBlockExpr { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("macro_block_exprs", vec![id.into()]); - if let Some(v) = self.tail_expr { - out.add_tuple("macro_block_expr_tail_exprs", vec![id.into(), v.into()]); - } for (i, v) in self.statements.into_iter().enumerate() { out.add_tuple("macro_block_expr_statements", vec![id.into(), i.into(), v.into()]); } + if let Some(v) = self.tail_expr { + out.add_tuple("macro_block_expr_tail_exprs", vec![id.into(), v.into()]); + } } } diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index ccd6143fb84..7433bf2138d 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -834,6 +834,38 @@ impl<'a> Translator<'a> { } } + pub(crate) fn emit_macro_stmts( + &mut self, + node: &ast::MacroStmts, + ) -> Option> { + // not generated to work around a bug in rust-analyzer AST generation machinery. + // Because an Expr can also be a Stmt (AsmExpr: Expr and AsmExpr: Item: Stmt) + // then such an element will be returned by both `expr()` and `statements()` + let mut statements = node.statements().collect::>(); + let tail_expr = node.expr(); + if tail_expr + .as_ref() + .is_some_and(|e| statements.last().is_some_and(|s| s.syntax() == e.syntax())) + { + // if the expression matched as both the tail_expr and the last of the statements, + // only take it as tail_expr + statements.pop(); + } + let tail_expr = tail_expr.and_then(|e| self.emit_expr(&e)); + let statements = statements + .iter() + .filter_map(|x| self.emit_stmt(x)) + .collect(); + let label = self.trap.emit(generated::MacroBlockExpr { + id: TrapId::Star, + tail_expr, + statements, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + fn is_attribute_macro_target(&self, node: &ast::Item) -> bool { // rust-analyzer considers as an `attr_macro_call` also a plain macro call, but we want to // process that differently (in `extract_macro_call_expanded`) diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index cbcb6f28c7b..402fdfaf6b0 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -1600,24 +1600,6 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } - pub(crate) fn emit_macro_stmts( - &mut self, - node: &ast::MacroStmts, - ) -> Option> { - let tail_expr = node.expr().and_then(|x| self.emit_expr(&x)); - let statements = node - .statements() - .filter_map(|x| self.emit_stmt(&x)) - .collect(); - let label = self.trap.emit(generated::MacroBlockExpr { - id: TrapId::Star, - tail_expr, - statements, - }); - self.emit_location(label, node); - self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); - Some(label) - } pub(crate) fn emit_macro_type( &mut self, node: &ast::MacroType, diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 86016b745f3..f03cf69df07 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 6a103a6d04c951ca2f0c2989bed737cdbac56dd5ea9432b858da3416412bbf79 cf2bc67b65a1555de58bbd0a35b834b8867112a2f7c1951307c9416400ce70d0 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 06394c1314f09d65b8ade88732f1114202e1896ebeb8d687f8ee230cea01127b 7a9223854ec30cae886b237d7930120ce073ab49af486b0d3bc971df2a039e62 lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/Adt.qll c2afed4ac2e17039ccd98f74ea22111f4d765c4e232c50ccd3128da0d26da837 1380bde2eb667c6ec2ef5f8710aa24e926851c9e321ebc72ba514fa92c369dc3 @@ -90,7 +90,7 @@ lib/codeql/rust/elements/LiteralPat.qll daffb5f380a47543669c8cc92628b0e0de478c3a lib/codeql/rust/elements/Locatable.qll 2855efa4a469b54e0ca85daa89309a8b991cded6f3f10db361010831ba1e11d3 00c3406d14603f90abea11bf074eaf2c0b623a30e29cf6afc3a247cb58b92f0f lib/codeql/rust/elements/LoopExpr.qll ee171177650fa23eef102a9580765f4b6073a1cc41bab1ec31ad4f84ffe6c2c9 bfcf0cca4dc944270d9748a202829a38c64dfae167c0d3a4202788ceb9daf5f6 lib/codeql/rust/elements/LoopingExpr.qll 7ad7d4bbfd05adc0bb9b4ca90ff3377b8298121ca5360ffb45d5a7a1e20fe37a 964168b2045ee9bad827bba53f10a64d649b3513f2d1e3c17a1b1f11d0fc7f3a -lib/codeql/rust/elements/MacroBlockExpr.qll fb81f067a142053b122e2875a15719565024cfb09326faf12e0f1017307deb58 3ee94ef7e56bd07a8f9304869b0a7b69971b02abbee46d0bebcacb4031760282 +lib/codeql/rust/elements/MacroBlockExpr.qll 077c968da099c10456be4b594675a074e9a4e43b5c5145e1b1ae1fa47ae6d570 99586e3766ee0c80364998128e067cab2639ac25c1dcbe13e0247d629490af6f lib/codeql/rust/elements/MacroCall.qll 452aee152b655cdd5a69bf973977072f000a6451f626469a3f7313f0468ffc18 a8652d0de1c6c2118d683d5465ba4115dd4c65031896440269a2a0522d90fceb lib/codeql/rust/elements/MacroDef.qll 5bcf2bba7ba40879fe47370bfeb65b23c67c463be20535327467338a1e2e04bb c3d28416fc08e5d79149fccd388fea2bc3097bce074468a323383056404926db lib/codeql/rust/elements/MacroExpr.qll 640554f4964def19936a16ce88a03fb12f74ec2bcfe38b88d32742b79f85d909 a284fb66e012664a33a4e9c8fd3e38d3ffd588fccd6b16b02270da55fc025f7a @@ -306,7 +306,7 @@ lib/codeql/rust/elements/internal/LiteralPatConstructor.qll b660cb428a0cba0b713f lib/codeql/rust/elements/internal/LoopExprConstructor.qll 45f3f8f7441fcab6adc58831421679ee07bac68ac0417f3cbc90c97426cc805b f7ab3361b4a11e898126378ea277d76949466946762cd6cb5e9e9b4bb9860420 lib/codeql/rust/elements/internal/LoopingExprImpl.qll 17885c1bcf7b5a3f9c7bbad3d4d55e24372af0dedd5e7fc0efcfc0a8b2cdad70 104dc45ca399b9f6e8227ad561679f728d60170398a52b31fc90cb2a2dd3c33c lib/codeql/rust/elements/internal/MacroBlockExprConstructor.qll 90097c0d2c94083e997396e01cf24349af5eb1788060368dc21ae8cd8ce90d93 e067904a734356e38fbadbc4277629c5987adce6d8f7737f7458ac07e9b264af -lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll f7a8dd1dcde2355353e17d06bb197e2d6e321ea64a39760a074d1887e68d63d6 8d429be9b6aa9f711e050b6b07f35637de22e8635a559e06dd9153a8b7947274 +lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll 323c0695ab1d8ee7d88a678eabdb6ac9d92293b9ae0846ec2c7ed8d76a591369 7b662b77cf2d885423d8734ff322c199650c1ea59a2c3371a1370efd7966e0c9 lib/codeql/rust/elements/internal/MacroCallConstructor.qll 707fee4fba1fd632cd00128f493e8919eaaea552ad653af4c1b7a138e362907d b49e7e36bf9306199f2326af042740ff858871b5c79f6aeddf3d5037044dbf1f lib/codeql/rust/elements/internal/MacroDefConstructor.qll 382a3bdf46905d112ee491620cc94f87d584d72f49e01eb1483f749e4709c055 eb61b90d8d8d655c2b00ff576ae20c8da9709eeef754212bc64d8e1558ad05ce lib/codeql/rust/elements/internal/MacroDefImpl.qll 73db95ff82834e0063699c7d31349b65e95ba7436fe0a8914dbdd3a383f8b1c9 cd2f078f84ce73fdc88b207df105b297f2cd3b780428968214443af3a2719e8f @@ -546,7 +546,7 @@ lib/codeql/rust/elements/internal/generated/LiteralPat.qll f36b09cf39330019c111e lib/codeql/rust/elements/internal/generated/Locatable.qll c897dc1bdd4dfcb6ded83a4a93332ca3d8f421bae02493ea2a0555023071775e b32d242f8c9480dc9b53c1e13a5cb8dcfce575b0373991c082c1db460a3e37b8 lib/codeql/rust/elements/internal/generated/LoopExpr.qll db6bc87e795c9852426ec661fa2c2c54106805897408b43a67f5b82fb4657afd 1492866ccf8213469be85bbdbcae0142f4e2a39df305d4c0d664229ecd1ebdb9 lib/codeql/rust/elements/internal/generated/LoopingExpr.qll 0792c38d84b8c68114da2bbdfef32ef803b696cb0fd06e10e101756d5c46976c 111fe961fad512722006323c3f2a075fddf59bd3eb5c7afc349835fcec8eb102 -lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll 778376cdfa4caaa9df0b9c21bda5ff0f1037b730aa43efb9fb0a08998ef3999b 6df39efe7823ce590ef6f4bdfa60957ba067205a77d94ac089b2c6a7f6b7b561 +lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll 7705de831e797c8742726a3c28dd8f87f6c1b9e2cccd20f01839d161f7ca37c7 ac79c5c95befc82f53b620ccc8a28fd9cc0f9e00c585ed4032bd75f99e0935fa lib/codeql/rust/elements/internal/generated/MacroCall.qll 1a7ee9c782ebc9ab0a807762aabebc9e0a7ef10c6eb945679737598630b20af2 782a437654cb316355c020e89d50b07c93ba7817715fa5d42a9e807cf12d1a43 lib/codeql/rust/elements/internal/generated/MacroDef.qll 90393408d9e10ff6167789367c30f9bfe1d3e8ac3b83871c6cb30a8ae37eef47 f022d1df45bc9546cb9fd7059f20e16a3acfaae2053bbd10075fe467c96e2379 lib/codeql/rust/elements/internal/generated/MacroExpr.qll 5a86ae36a28004ce5e7eb30addf763eef0f1c614466f4507a3935b0dab2c7ce3 11c15e8ebd36455ec9f6b7819134f6b22a15a3644678ca96b911ed0eb1181873 @@ -574,7 +574,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll 389ee1eea791f9d2a5eb9ae49d2aa61607f8cdb3f3d5752d5c067122029de66a 50875ace3751c001acc11fa596ea1cd8c8b17dd925344c2d91d338b3f864df0d +lib/codeql/rust/elements/internal/generated/ParentChild.qll d43d7486ed04a3930fa476694fc74d972f4413992968de425573ccf823343c87 3d4245aee40a38bff658f2c0cb220d5276ae751194c5b728b65054ec98c841e4 lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -589,7 +589,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 1578a58b7115fed2bfdaf65c3a9e6ef8318660b11a9c8f1cc334114f9c38e0af a8ea88419f42be7a40d7419d07a0469380ba3c4706e6a580554a4c28e216fc00 +lib/codeql/rust/elements/internal/generated/Raw.qll a608725b53de8509b1b5f2a29e1636bda2e6baaa5d4218397f690f43f3c89011 6c09465d83f71e9e54917f2d4436eeb865c9abaf7a941e8a8cfc2faf29c794f4 lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -724,7 +724,7 @@ test/extractor-tests/generated/LifetimeParam/LifetimeParam.ql a96f586af332969878 test/extractor-tests/generated/LiteralExpr/LiteralExpr.ql 00570642966d233a10ec3106ae65e6ea865c29d0776fdbc452815f528301117c adb286ad3bd763f1b1b350cac91bc2615869dcb9b0faf29276ace9a99d31f0cc test/extractor-tests/generated/LiteralPat/LiteralPat.ql 863d4902e7e22de3176398cbb908e6f5f487b3d22c0f9f7a5498a1ebc112c0fd 47e3f70c5c32f17050d3ca8c8b42d94ecd38e378627880d8100b7ca182cfa793 test/extractor-tests/generated/LoopExpr/LoopExpr.ql a178e25f63b4d517482ec63e5dfb6903dd41dadd8db39be2dd2a831e8456811f f34165f78179960cc7e5876dac26a1d0f6f67933eff9a015b92ca0e2872b63e8 -test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql 62859a25b88c93db1d47055f682f1b8ed97ef227c870bc14041af106cb9593fd 14c5831920249ef2e0799ddacca62805e2e2d8b8a6cbd244acb3a20c4542bf7b +test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql 936920b5b609b1e62b201004055bbce449d2d7c1f8016f57d9b27d3ea8107f07 21493009ed3b1810aa4fd8af4d8c7b7794982da032dfb6b7e9048445d651eecb test/extractor-tests/generated/MacroCall/MacroCall.ql f98017f6070e2a5e4b191d5380cc0491d7358c456e8459b313235e44eb368794 437129210d9b7f6850adf4d2c8ef7d0644193418645d631b8edf229656fc57ac test/extractor-tests/generated/MacroDef/MacroDef.ql 9e3647a92713d32f87e876f37d703081855ea88a7a3104757f90bd94eb382fa9 b50e9797c1b8ea5491267ddb6778862f0541617ee60bd8e167cc23a499e36733 test/extractor-tests/generated/MacroExpr/MacroExpr.ql 83fadb88fd8f913bb1b1cda26d21b173bdc94bb6682a74eaddce650ebf72aa41 1c502cde6a95ec637e43d348c613be3dec4092b69d2c8692abdc5a9377e37f5f diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index 36dd0fb304f..811ddf4978a 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -1797,9 +1797,15 @@ module MakeCfgNodes Input> { /** * A sequence of statements generated by a `MacroCall`. For example: * ```rust - * fn main() { - * println!("Hello, world!"); // This macro expands into a list of statements + * macro_rules! my_macro { + * () => { + * let mut x = 40; + * x += 2; + * x + * }; * } + * + * my_macro!(); // this macro expands to a sequence of statements (and an expression) * ``` */ final class MacroBlockExprCfgNode extends CfgNodeFinal, ExprCfgNode { @@ -1810,18 +1816,6 @@ module MakeCfgNodes Input> { /** Gets the underlying `MacroBlockExpr`. */ MacroBlockExpr getMacroBlockExpr() { result = node } - /** - * Gets the tail expression of this macro block expression, if it exists. - */ - ExprCfgNode getTailExpr() { - any(ChildMapping mapping).hasCfgChild(node, node.getTailExpr(), this, result) - } - - /** - * Holds if `getTailExpr()` exists. - */ - predicate hasTailExpr() { exists(this.getTailExpr()) } - /** * Gets the `index`th statement of this macro block expression (0-based). */ @@ -1836,6 +1830,18 @@ module MakeCfgNodes Input> { * Gets the number of statements of this macro block expression. */ int getNumberOfStatements() { result = count(int i | exists(this.getStatement(i))) } + + /** + * Gets the tail expression of this macro block expression, if it exists. + */ + ExprCfgNode getTailExpr() { + any(ChildMapping mapping).hasCfgChild(node, node.getTailExpr(), this, result) + } + + /** + * Holds if `getTailExpr()` exists. + */ + predicate hasTailExpr() { exists(this.getTailExpr()) } } final private class ParentMacroCall extends ParentAstNode, MacroCall { diff --git a/rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll b/rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll index 8fcd2119a0a..0ad76f8a973 100644 --- a/rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll @@ -10,9 +10,15 @@ import codeql.rust.elements.Stmt /** * A sequence of statements generated by a `MacroCall`. For example: * ```rust - * fn main() { - * println!("Hello, world!"); // This macro expands into a list of statements + * macro_rules! my_macro { + * () => { + * let mut x = 40; + * x += 2; + * x + * }; * } + * + * my_macro!(); // this macro expands to a sequence of statements (and an expression) * ``` */ final class MacroBlockExpr = Impl::MacroBlockExpr; diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll index 60030dd6f27..289e6c33a30 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll @@ -15,9 +15,15 @@ module Impl { /** * A sequence of statements generated by a `MacroCall`. For example: * ```rust - * fn main() { - * println!("Hello, world!"); // This macro expands into a list of statements + * macro_rules! my_macro { + * () => { + * let mut x = 40; + * x += 2; + * x + * }; * } + * + * my_macro!(); // this macro expands to a sequence of statements (and an expression) * ``` */ class MacroBlockExpr extends Generated::MacroBlockExpr { } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll index 3dd6411e20e..e7b94d9f04c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll @@ -18,9 +18,15 @@ module Generated { /** * A sequence of statements generated by a `MacroCall`. For example: * ```rust - * fn main() { - * println!("Hello, world!"); // This macro expands into a list of statements + * macro_rules! my_macro { + * () => { + * let mut x = 40; + * x += 2; + * x + * }; * } + * + * my_macro!(); // this macro expands to a sequence of statements (and an expression) * ``` * INTERNAL: Do not reference the `Generated::MacroBlockExpr` class directly. * Use the subclass `MacroBlockExpr`, where the following predicates are available. @@ -28,21 +34,6 @@ module Generated { class MacroBlockExpr extends Synth::TMacroBlockExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MacroBlockExpr" } - /** - * Gets the tail expression of this macro block expression, if it exists. - */ - Expr getTailExpr() { - result = - Synth::convertExprFromRaw(Synth::convertMacroBlockExprToRaw(this) - .(Raw::MacroBlockExpr) - .getTailExpr()) - } - - /** - * Holds if `getTailExpr()` exists. - */ - final predicate hasTailExpr() { exists(this.getTailExpr()) } - /** * Gets the `index`th statement of this macro block expression (0-based). */ @@ -62,5 +53,20 @@ module Generated { * Gets the number of statements of this macro block expression. */ final int getNumberOfStatements() { result = count(int i | exists(this.getStatement(i))) } + + /** + * Gets the tail expression of this macro block expression, if it exists. + */ + Expr getTailExpr() { + result = + Synth::convertExprFromRaw(Synth::convertMacroBlockExprToRaw(this) + .(Raw::MacroBlockExpr) + .getTailExpr()) + } + + /** + * Holds if `getTailExpr()` exists. + */ + final predicate hasTailExpr() { exists(this.getTailExpr()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index 3011eccbee4..4aff5eec64d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -1489,17 +1489,17 @@ private module Impl { private Element getImmediateChildOfMacroBlockExpr( MacroBlockExpr e, int index, string partialPredicateCall ) { - exists(int n, int nTailExpr, int nStatement | + exists(int n, int nStatement, int nTailExpr | n = 0 and - nTailExpr = n + 1 and - nStatement = nTailExpr + 1 + max(int i | i = -1 or exists(e.getStatement(i)) | i) and + nStatement = n + 1 + max(int i | i = -1 or exists(e.getStatement(i)) | i) and + nTailExpr = nStatement + 1 and ( none() or - index = n and result = e.getTailExpr() and partialPredicateCall = "TailExpr()" + result = e.getStatement(index - n) and + partialPredicateCall = "Statement(" + (index - n).toString() + ")" or - result = e.getStatement(index - nTailExpr) and - partialPredicateCall = "Statement(" + (index - nTailExpr).toString() + ")" + index = nStatement and result = e.getTailExpr() and partialPredicateCall = "TailExpr()" ) ) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index d0aa59d583e..3b8860b6f7c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -2619,23 +2619,29 @@ module Raw { * INTERNAL: Do not use. * A sequence of statements generated by a `MacroCall`. For example: * ```rust - * fn main() { - * println!("Hello, world!"); // This macro expands into a list of statements + * macro_rules! my_macro { + * () => { + * let mut x = 40; + * x += 2; + * x + * }; * } + * + * my_macro!(); // this macro expands to a sequence of statements (and an expression) * ``` */ class MacroBlockExpr extends @macro_block_expr, Expr { override string toString() { result = "MacroBlockExpr" } - /** - * Gets the tail expression of this macro block expression, if it exists. - */ - Expr getTailExpr() { macro_block_expr_tail_exprs(this, result) } - /** * Gets the `index`th statement of this macro block expression (0-based). */ Stmt getStatement(int index) { macro_block_expr_statements(this, index, result) } + + /** + * Gets the tail expression of this macro block expression, if it exists. + */ + Expr getTailExpr() { macro_block_expr_tail_exprs(this, result) } } /** diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 3c1990e7f1d..b41e55c0dba 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -2049,12 +2049,6 @@ macro_block_exprs( unique int id: @macro_block_expr ); -#keyset[id] -macro_block_expr_tail_exprs( - int id: @macro_block_expr ref, - int tail_expr: @expr ref -); - #keyset[id, index] macro_block_expr_statements( int id: @macro_block_expr ref, @@ -2062,6 +2056,12 @@ macro_block_expr_statements( int statement: @stmt ref ); +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + macro_exprs( unique int id: @macro_expr ); diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index e41f01de20a..f23ccd30563 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -67,7 +67,7 @@ LifetimeParam/gen_lifetime_param.rs e3f9a417ae7a88a4d81d9cb747b361a3246d270d142f LiteralExpr/gen_literal_expr.rs 2db01ad390e5c0c63a957c043230a462cb4cc25715eea6ede15d43c55d35976d 2db01ad390e5c0c63a957c043230a462cb4cc25715eea6ede15d43c55d35976d LiteralPat/gen_literal_pat.rs a471b481b6989001817a3988696f445d9a4dea784e543c346536dacbee1e96f3 a471b481b6989001817a3988696f445d9a4dea784e543c346536dacbee1e96f3 LoopExpr/gen_loop_expr.rs 35deaf35e765db4ae3124a11284266d8f341d1ce7b700030efada0dda8878619 35deaf35e765db4ae3124a11284266d8f341d1ce7b700030efada0dda8878619 -MacroBlockExpr/gen_macro_block_expr.rs 2e45dcf44bf2e8404b49ce9abeee4931572693174b5d96f3fd81eb40ea8e7b4b 2e45dcf44bf2e8404b49ce9abeee4931572693174b5d96f3fd81eb40ea8e7b4b +MacroBlockExpr/gen_macro_block_expr.rs 4284a6e6ad81827d8616a00fec7f5bc21104eed40d93e3acc2b933ee22cb8577 4284a6e6ad81827d8616a00fec7f5bc21104eed40d93e3acc2b933ee22cb8577 MacroCall/gen_macro_call.rs c30added613d9edb3cb1321ae46fc6a088a2f22d2cc979119466ec02f6e09ed6 c30added613d9edb3cb1321ae46fc6a088a2f22d2cc979119466ec02f6e09ed6 MacroDef/gen_macro_def.rs 6f895ecab8c13a73c28ce67fcee39baf7928745a80fb440811014f6d31b22378 6f895ecab8c13a73c28ce67fcee39baf7928745a80fb440811014f6d31b22378 MacroExpr/gen_macro_expr.rs 5e1748356f431eea343a2aad2798c22073151940ea2cda0f0cce78c3d96104f0 5e1748356f431eea343a2aad2798c22073151940ea2cda0f0cce78c3d96104f0 diff --git a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected index 3fa93611a58..10f3409cc79 100644 --- a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected +++ b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected @@ -1,2 +1 @@ | gen_asm_clobber_abi.rs:8:14:8:29 | AsmClobberAbi | -| gen_asm_clobber_abi.rs:8:14:8:29 | AsmClobberAbi | diff --git a/rust/ql/test/extractor-tests/generated/AsmConst/AsmConst.expected b/rust/ql/test/extractor-tests/generated/AsmConst/AsmConst.expected index f87adbca9bd..30ed42e46f9 100644 --- a/rust/ql/test/extractor-tests/generated/AsmConst/AsmConst.expected +++ b/rust/ql/test/extractor-tests/generated/AsmConst/AsmConst.expected @@ -1,6 +1,4 @@ instances | gen_asm_const.rs:8:30:8:37 | AsmConst | isConst: | yes | -| gen_asm_const.rs:8:30:8:37 | AsmConst | isConst: | yes | getExpr | gen_asm_const.rs:8:30:8:37 | AsmConst | gen_asm_const.rs:8:36:8:37 | 42 | -| gen_asm_const.rs:8:30:8:37 | AsmConst | gen_asm_const.rs:8:36:8:37 | 42 | diff --git a/rust/ql/test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.expected b/rust/ql/test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.expected index dc6fb69446b..977c8504c0e 100644 --- a/rust/ql/test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.expected +++ b/rust/ql/test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.expected @@ -1,4 +1,2 @@ | gen_asm_dir_spec.rs:8:47:8:49 | AsmDirSpec | -| gen_asm_dir_spec.rs:8:47:8:49 | AsmDirSpec | -| gen_asm_dir_spec.rs:8:67:8:68 | AsmDirSpec | | gen_asm_dir_spec.rs:8:67:8:68 | AsmDirSpec | diff --git a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected index cdc2abe7bed..cbd9eac398a 100644 --- a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected +++ b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected @@ -1,6 +1,4 @@ instances | gen_asm_label.rs:10:9:10:47 | AsmLabel | -| gen_asm_label.rs:10:9:10:47 | AsmLabel | getBlockExpr | gen_asm_label.rs:10:9:10:47 | AsmLabel | gen_asm_label.rs:10:15:10:47 | { ... } | -| gen_asm_label.rs:10:9:10:47 | AsmLabel | gen_asm_label.rs:10:15:10:47 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.expected b/rust/ql/test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.expected index f252705d0d9..262ca3ada57 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.expected @@ -1,15 +1,9 @@ instances | gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | -| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | -| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | | gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | getInExpr | gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x | -| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x | -| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y | | gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y | getOutExpr | gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x | -| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x | -| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y | | gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y | diff --git a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected index 66dcd7eb7d0..c8aec731ff8 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected @@ -1,13 +1,8 @@ instances | gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | -| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | -| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | | gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | getAsmOperand | gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | gen_asm_operand_named.rs:8:34:8:43 | AsmRegOperand | -| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | gen_asm_operand_named.rs:8:34:8:43 | AsmRegOperand | -| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:54:8:62 | AsmRegOperand | | gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:54:8:62 | AsmRegOperand | getName | gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:46:8:50 | input | -| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:46:8:50 | input | diff --git a/rust/ql/test/extractor-tests/generated/AsmOption/AsmOption.expected b/rust/ql/test/extractor-tests/generated/AsmOption/AsmOption.expected index 4bb6ff00140..ddd5bc880b9 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOption/AsmOption.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOption/AsmOption.expected @@ -1,4 +1,2 @@ | gen_asm_option.rs:8:22:8:28 | AsmOption | isRaw: | no | -| gen_asm_option.rs:8:22:8:28 | AsmOption | isRaw: | no | -| gen_asm_option.rs:8:31:8:35 | AsmOption | isRaw: | no | | gen_asm_option.rs:8:31:8:35 | AsmOption | isRaw: | no | diff --git a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected index db19616d779..cf9ec35d070 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected @@ -1,8 +1,5 @@ instances | gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | -| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | getAsmOption | gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 0 | gen_asm_options_list.rs:8:22:8:28 | AsmOption | -| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 0 | gen_asm_options_list.rs:8:22:8:28 | AsmOption | -| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 1 | gen_asm_options_list.rs:8:31:8:35 | AsmOption | | gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 1 | gen_asm_options_list.rs:8:31:8:35 | AsmOption | diff --git a/rust/ql/test/extractor-tests/generated/AsmRegOperand/AsmRegOperand.expected b/rust/ql/test/extractor-tests/generated/AsmRegOperand/AsmRegOperand.expected index 62aa617aa8d..a141f1a25c2 100644 --- a/rust/ql/test/extractor-tests/generated/AsmRegOperand/AsmRegOperand.expected +++ b/rust/ql/test/extractor-tests/generated/AsmRegOperand/AsmRegOperand.expected @@ -1,20 +1,12 @@ instances | gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | -| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | -| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | | gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | getAsmDirSpec | gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:26:8:28 | AsmDirSpec | -| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:26:8:28 | AsmDirSpec | -| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:38:8:39 | AsmDirSpec | | gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:38:8:39 | AsmDirSpec | getAsmOperandExpr | gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:35:8:35 | AsmOperandExpr | -| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:35:8:35 | AsmOperandExpr | -| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:46:8:46 | AsmOperandExpr | | gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:46:8:46 | AsmOperandExpr | getAsmRegSpec | gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:30:8:32 | AsmRegSpec | -| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:30:8:32 | AsmRegSpec | -| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:41:8:43 | AsmRegSpec | | gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:41:8:43 | AsmRegSpec | diff --git a/rust/ql/test/extractor-tests/generated/AsmRegSpec/AsmRegSpec.expected b/rust/ql/test/extractor-tests/generated/AsmRegSpec/AsmRegSpec.expected index 31fb38d585f..120ba8d2093 100644 --- a/rust/ql/test/extractor-tests/generated/AsmRegSpec/AsmRegSpec.expected +++ b/rust/ql/test/extractor-tests/generated/AsmRegSpec/AsmRegSpec.expected @@ -1,8 +1,5 @@ instances | gen_asm_reg_spec.rs:8:30:8:34 | AsmRegSpec | -| gen_asm_reg_spec.rs:8:30:8:34 | AsmRegSpec | -| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | | gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | getIdentifier | gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | gen_asm_reg_spec.rs:8:43:8:45 | EBX | -| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | gen_asm_reg_spec.rs:8:43:8:45 | EBX | diff --git a/rust/ql/test/extractor-tests/generated/AsmSym/AsmSym.expected b/rust/ql/test/extractor-tests/generated/AsmSym/AsmSym.expected index 688d38c5ac6..e3f8fbc9ec7 100644 --- a/rust/ql/test/extractor-tests/generated/AsmSym/AsmSym.expected +++ b/rust/ql/test/extractor-tests/generated/AsmSym/AsmSym.expected @@ -1,6 +1,4 @@ instances | gen_asm_sym.rs:8:30:8:44 | AsmSym | -| gen_asm_sym.rs:8:30:8:44 | AsmSym | getPath | gen_asm_sym.rs:8:30:8:44 | AsmSym | gen_asm_sym.rs:8:34:8:44 | my_function | -| gen_asm_sym.rs:8:30:8:44 | AsmSym | gen_asm_sym.rs:8:34:8:44 | my_function | diff --git a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.expected b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.expected index 67d330d937e..d6887babe7e 100644 --- a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.expected @@ -1,5 +1,7 @@ instances -| gen_macro_block_expr.rs:5:14:5:28 | MacroBlockExpr | -getTailExpr -| gen_macro_block_expr.rs:5:14:5:28 | MacroBlockExpr | gen_macro_block_expr.rs:5:14:5:28 | { ... } | +| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | getStatement +| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | 0 | gen_macro_block_expr.rs:13:5:13:13 | let ... = 40 | +| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | 1 | gen_macro_block_expr.rs:13:5:13:13 | ExprStmt | +getTailExpr +| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | gen_macro_block_expr.rs:13:5:13:13 | x | diff --git a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql index 82502ad4ec0..bae6d7d1f62 100644 --- a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql +++ b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql @@ -4,10 +4,10 @@ import TestUtils query predicate instances(MacroBlockExpr x) { toBeTested(x) and not x.isUnknown() } -query predicate getTailExpr(MacroBlockExpr x, Expr getTailExpr) { - toBeTested(x) and not x.isUnknown() and getTailExpr = x.getTailExpr() -} - query predicate getStatement(MacroBlockExpr x, int index, Stmt getStatement) { toBeTested(x) and not x.isUnknown() and getStatement = x.getStatement(index) } + +query predicate getTailExpr(MacroBlockExpr x, Expr getTailExpr) { + toBeTested(x) and not x.isUnknown() and getTailExpr = x.getTailExpr() +} diff --git a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/gen_macro_block_expr.rs b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/gen_macro_block_expr.rs index 035b7ddc98c..62a408411e8 100644 --- a/rust/ql/test/extractor-tests/generated/MacroBlockExpr/gen_macro_block_expr.rs +++ b/rust/ql/test/extractor-tests/generated/MacroBlockExpr/gen_macro_block_expr.rs @@ -1,6 +1,14 @@ // generated by codegen, do not edit -// A sequence of statements generated by a `MacroCall`. For example: -fn main() { - println!("Hello, world!"); // This macro expands into a list of statements +fn test_macro_block_expr() -> () { + // A sequence of statements generated by a `MacroCall`. For example: + macro_rules! my_macro { + () => { + let mut x = 40; + x += 2; + x + }; + } + + my_macro!(); // this macro expands to a sequence of statements (and an expression) } diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index bc07e1610f1..7313255b144 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1404,17 +1404,25 @@ class _: """ -@annotate(MacroBlockExpr, replace_bases={AstNode: Expr}, cfg=True) -@rust.doc_test_signature(None) -class _: +class MacroBlockExpr(Expr): """ A sequence of statements generated by a `MacroCall`. For example: ```rust - fn main() { - println!("Hello, world!"); // This macro expands into a list of statements + macro_rules! my_macro { + () => { + let mut x = 40; + x += 2; + x + }; } + + my_macro!(); // this macro expands to a sequence of statements (and an expression) ``` """ + __cfg__ = True + + statements: list[Stmt] | child + tail_expr: optional[Expr] | child @annotate(MacroTypeRepr) diff --git a/rust/schema/ast.py b/rust/schema/ast.py index e527d318b66..c9c0d4e7ddb 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -399,10 +399,6 @@ class MacroRules(Item, ): token_tree: optional["TokenTree"] | child visibility: optional["Visibility"] | child -class MacroBlockExpr(AstNode, ): - tail_expr: optional["Expr"] | child - statements: list["Stmt"] | child - class MacroTypeRepr(TypeRepr, ): macro_call: optional["MacroCall"] | child