diff options
author | Sebastien Lacoste <dev@graphman.fr> | 2022-06-24 10:44:03 +0200 |
---|---|---|
committer | Sebastien Lacoste <dev@graphman.fr> | 2022-06-24 18:50:07 +0200 |
commit | 40ad6b290af7d4e2e4d4a35a759d1b21d60423f5 (patch) | |
tree | 818cddf83030a646146ffe5686b1e4b760eeb454 /gcc | |
parent | 7c7202c2316c080056f3bf2dc1e3c713cceb1e85 (diff) | |
download | gcc-40ad6b290af7d4e2e4d4a35a759d1b21d60423f5.zip gcc-40ad6b290af7d4e2e4d4a35a759d1b21d60423f5.tar.gz gcc-40ad6b290af7d4e2e4d4a35a759d1b21d60423f5.tar.bz2 |
Add line builtin macro
Signed-off-by: Sebastien Lacoste <dev@graphman.fr>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 13 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.h | 3 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 1 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/builtin_macro_line.rs | 22 |
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index d062f1a..2b175fc 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -467,4 +467,17 @@ MacroBuiltin::include (Location invoc_locus, AST::MacroInvocData &invoc) return AST::ASTFragment (nodes); } +AST::ASTFragment +MacroBuiltin::line (Location invoc_locus, AST::MacroInvocData &invoc) +{ + auto current_line + = Session::get_instance ().linemap->location_to_line (invoc_locus); + + auto line_no = AST::SingleASTNode (std::unique_ptr<AST::Expr> ( + new AST::LiteralExpr (std::to_string (current_line), AST::Literal::INT, + PrimitiveCoreType::CORETYPE_U32, {}, invoc_locus))); + + return AST::ASTFragment ({line_no}); +} + } // namespace Rust diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index f1d10df..91f3727 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -98,6 +98,9 @@ public: static AST::ASTFragment include (Location invoc_locus, AST::MacroInvocData &invoc); + + static AST::ASTFragment line (Location invoc_locus, + AST::MacroInvocData &invoc); }; } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index c21b681..8b3be5c 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -831,6 +831,7 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro) builtin_macros = { {"assert", MacroBuiltin::assert}, {"file", MacroBuiltin::file}, + {"line", MacroBuiltin::line}, {"column", MacroBuiltin::column}, {"include_bytes", MacroBuiltin::include_bytes}, {"include_str", MacroBuiltin::include_str}, diff --git a/gcc/testsuite/rust/execute/torture/builtin_macro_line.rs b/gcc/testsuite/rust/execute/torture/builtin_macro_line.rs new file mode 100644 index 0000000..873054d --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/builtin_macro_line.rs @@ -0,0 +1,22 @@ +// { dg-output "15\n18\n" } +extern "C" { + fn printf(fmt: *const i8, ...); +} + +fn print(s: u32) { + printf("%u\n\0" as *const str as *const i8, s); +} + +macro_rules! line { + () => {{}}; +} + +fn main() -> i32 { + let a = line!(); + print(a); + + let b = line!(); + print(b); + + 0 +} |