public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] Added column!() macro
@ 2022-06-08 12:18 Thomas Schwinge
0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 12:18 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d9a5bddb4c64268f2411a2b317872fe0c26284c3
commit d9a5bddb4c64268f2411a2b317872fe0c26284c3
Author: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
Date: Thu Mar 10 12:38:29 2022 +0530
Added column!() macro
Addresses issue #979
1) Added the column!() macro using the LOCATION_COLUMN() from gcc_linemap
2) Added relevent test cases
Signed-off-by : M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
Diff:
---
gcc/rust/expand/rust-macro-builtins.cc | 14 +++++++++++++
gcc/rust/expand/rust-macro-builtins.h | 3 +++
gcc/rust/rust-linemap.cc | 9 ++++++++
gcc/rust/rust-linemap.h | 9 ++++++++
gcc/rust/util/rust-hir-map.cc | 1 +
.../rust/execute/torture/builtin_macros3.rs | 24 ++++++++++++++++++++++
6 files changed, 60 insertions(+)
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc
index ce0be92dad0..c33a2e86f88 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -49,4 +49,18 @@ MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc)
return AST::ASTFragment ({file_str});
}
+AST::ASTFragment
+MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc)
+{
+ auto current_column
+ = Session::get_instance ().linemap->location_to_column (invoc_locus);
+ // auto column_no
+ // = AST::SingleASTNode (make_string (invoc_locus, current_column));
+
+ auto column_no = AST::SingleASTNode (std::unique_ptr<AST::Expr> (
+ new AST::LiteralExpr (std::to_string (current_column), AST::Literal::INT,
+ PrimitiveCoreType::CORETYPE_U32, {}, invoc_locus)));
+
+ return AST::ASTFragment ({column_no});
+}
} // namespace Rust
diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h
index ee42fe1dcc6..d9461295c08 100644
--- a/gcc/rust/expand/rust-macro-builtins.h
+++ b/gcc/rust/expand/rust-macro-builtins.h
@@ -31,6 +31,9 @@ public:
static AST::ASTFragment file (Location invoc_locus,
AST::MacroInvocData &invoc);
+
+ static AST::ASTFragment column (Location invoc_locus,
+ AST::MacroInvocData &invoc);
};
} // namespace Rust
diff --git a/gcc/rust/rust-linemap.cc b/gcc/rust/rust-linemap.cc
index 637d74965dd..b32a965a4aa 100644
--- a/gcc/rust/rust-linemap.cc
+++ b/gcc/rust/rust-linemap.cc
@@ -42,6 +42,8 @@ public:
int location_line (Location);
+ int location_column (Location);
+
protected:
Location get_predeclared_location ();
@@ -111,6 +113,13 @@ Gcc_linemap::location_line (Location loc)
return LOCATION_LINE (loc.gcc_location ());
}
+// Return the column number for a given location.
+int
+Gcc_linemap::location_column (Location loc)
+{
+ return LOCATION_COLUMN (loc.gcc_location ());
+}
+
// Stop getting locations.
void
diff --git a/gcc/rust/rust-linemap.h b/gcc/rust/rust-linemap.h
index c8472a17672..0ba95f87575 100644
--- a/gcc/rust/rust-linemap.h
+++ b/gcc/rust/rust-linemap.h
@@ -72,6 +72,9 @@ public:
// Return the line number for a given location.
virtual int location_line (Location) = 0;
+ // Return the column number for a given location.
+ virtual int location_column (Location) = 0;
+
protected:
// Return a special Location used for predeclared identifiers. This
// Location should be different from that for any actual source
@@ -149,6 +152,12 @@ public:
rust_assert (Linemap::instance_ != NULL);
return Linemap::instance_->location_line (loc);
}
+
+ static int location_to_column (Location loc)
+ {
+ rust_assert (Linemap::instance_ != NULL);
+ return Linemap::instance_->location_column (loc);
+ }
};
#endif // !defined(RUST_LINEMAP_H)
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 9190bd92a43..5b0417b4549 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -750,6 +750,7 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro)
builtin_macros = {
{"assert", MacroBuiltin::assert},
{"file", MacroBuiltin::file},
+ {"column", MacroBuiltin::column},
};
auto builtin = builtin_macros.find (macro->get_rule_name ());
diff --git a/gcc/testsuite/rust/execute/torture/builtin_macros3.rs b/gcc/testsuite/rust/execute/torture/builtin_macros3.rs
new file mode 100644
index 00000000000..ed117803c07
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/builtin_macros3.rs
@@ -0,0 +1,24 @@
+// { dg-output "14\n42\n" }
+macro_rules! column {
+ () => {{}};
+}
+
+extern "C" {
+ fn printf(fmt: *const i8, ...);
+}
+
+fn print(s: u32) {
+ printf("%u\n\0" as *const str as *const i8, s);
+}
+
+fn main() -> i32 {
+ let c0 = column!();
+
+ print(c0);
+
+ let c1 = column!();
+
+ print(c1);
+
+ 0
+}
\ No newline at end of file
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-08 12:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 12:18 [gcc/devel/rust/master] Added column!() macro Thomas Schwinge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).