diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 22 | ||||
-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_macros1.rs | 18 |
4 files changed, 44 insertions, 0 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index b7bbd32..ce0be92 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -18,8 +18,20 @@ #include "rust-macro-builtins.h" #include "rust-diagnostics.h" +#include "rust-expr.h" +#include "rust-session-manager.h" namespace Rust { +namespace { +std::unique_ptr<AST::Expr> +make_string (Location locus, std::string value) +{ + return std::unique_ptr<AST::Expr> ( + new AST::LiteralExpr (value, AST::Literal::STRING, + PrimitiveCoreType::CORETYPE_STR, {}, locus)); +} +} // namespace + AST::ASTFragment MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc) { @@ -27,4 +39,14 @@ MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc) return AST::ASTFragment::create_empty (); } + +AST::ASTFragment +MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc) +{ + auto current_file + = Session::get_instance ().linemap->location_file (invoc_locus); + auto file_str = AST::SingleASTNode (make_string (invoc_locus, current_file)); + + return AST::ASTFragment ({file_str}); +} } // namespace Rust diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index f279d39..ee42fe1 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -28,6 +28,9 @@ class MacroBuiltin public: static AST::ASTFragment assert (Location invoc_locus, AST::MacroInvocData &invoc); + + static AST::ASTFragment file (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 1c0e8fc..d154a8a 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -746,6 +746,7 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro) Location, AST::MacroInvocData &)>> builtin_macros = { {"assert", MacroBuiltin::assert}, + {"file", MacroBuiltin::file}, }; auto builtin = builtin_macros.find (macro->get_rule_name ()); diff --git a/gcc/testsuite/rust/execute/torture/builtin_macros1.rs b/gcc/testsuite/rust/execute/torture/builtin_macros1.rs new file mode 100644 index 0000000..d68f62f --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/builtin_macros1.rs @@ -0,0 +1,18 @@ +// { dg-output "rust/execute/torture/builtin_macros1.rs" } +macro_rules! file { + () => {{}}; +} + +extern "C" { + fn printf(fmt: *const i8, ...); +} + +fn print(s: &str) { + printf("%s\n\0" as *const str as *const i8, s); +} + +fn main() -> i32 { + print(file!()); + + 0 +} |