aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-02-16 09:48:58 +0000
committerGitHub <noreply@github.com>2022-02-16 09:48:58 +0000
commit330b265134afd12e06884205e7b77334393864b8 (patch)
tree8efd84f917a1a684e0813b55c552f140e89337d2
parentc7275a7fb89f324e7cd7881d12a49287a89f1c74 (diff)
parent08dbb4e32263e611691dc73519b95a97e638fb41 (diff)
downloadgcc-330b265134afd12e06884205e7b77334393864b8.zip
gcc-330b265134afd12e06884205e7b77334393864b8.tar.gz
gcc-330b265134afd12e06884205e7b77334393864b8.tar.bz2
Merge #926
926: macros: Add multiple macro syntax tests r=CohenArthur a=CohenArthur This PR adds test cases for macros, including parsing and execution. I am unsure on how to check for proper execution: The solution I have chosen so far is to make sure that a correct amount of lines is printed, which I'm not entirely satisfied with. Another solution would be to increase a global integer to use when exiting, which we can then assert on using dejagnu, which is cleaner but relies on unsafe rust code. Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
-rw-r--r--gcc/testsuite/rust/compile/macro1.rs3
-rw-r--r--gcc/testsuite/rust/compile/macro2.rs3
-rw-r--r--gcc/testsuite/rust/compile/macro3.rs3
-rw-r--r--gcc/testsuite/rust/compile/macro4.rs3
-rw-r--r--gcc/testsuite/rust/compile/macro5.rs3
-rw-r--r--gcc/testsuite/rust/execute/xfail/macro1.rs32
-rw-r--r--gcc/testsuite/rust/execute/xfail/macro2.rs30
-rw-r--r--gcc/testsuite/rust/execute/xfail/macro3.rs45
8 files changed, 122 insertions, 0 deletions
diff --git a/gcc/testsuite/rust/compile/macro1.rs b/gcc/testsuite/rust/compile/macro1.rs
new file mode 100644
index 0000000..8cd9418
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro1.rs
@@ -0,0 +1,3 @@
+macro_rules! empty_parens {
+ () => ();
+}
diff --git a/gcc/testsuite/rust/compile/macro2.rs b/gcc/testsuite/rust/compile/macro2.rs
new file mode 100644
index 0000000..a437655
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro2.rs
@@ -0,0 +1,3 @@
+macro_rules! empty_brackets {
+ [] => [];
+}
diff --git a/gcc/testsuite/rust/compile/macro3.rs b/gcc/testsuite/rust/compile/macro3.rs
new file mode 100644
index 0000000..e5d3e93
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro3.rs
@@ -0,0 +1,3 @@
+macro_rules! empty_curlies {
+ {} => {};
+}
diff --git a/gcc/testsuite/rust/compile/macro4.rs b/gcc/testsuite/rust/compile/macro4.rs
new file mode 100644
index 0000000..47ff6c9
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro4.rs
@@ -0,0 +1,3 @@
+macro_rules! one_keyword {
+ (kw) => {};
+}
diff --git a/gcc/testsuite/rust/compile/macro5.rs b/gcc/testsuite/rust/compile/macro5.rs
new file mode 100644
index 0000000..a5d8095
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macro5.rs
@@ -0,0 +1,3 @@
+macro_rules! rust_keyword {
+ (fn) => {};
+}
diff --git a/gcc/testsuite/rust/execute/xfail/macro1.rs b/gcc/testsuite/rust/execute/xfail/macro1.rs
new file mode 100644
index 0000000..eab5a02
--- /dev/null
+++ b/gcc/testsuite/rust/execute/xfail/macro1.rs
@@ -0,0 +1,32 @@
+// { dg-output "macro\nmacro\nmacro\nmacro\n" }
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+fn f() {
+ let r_s = "macro\n\0";
+ let s_p = r_s as *const str;
+ let c_p = s_p as *const i8;
+
+ printf(c_p);
+}
+
+macro_rules! empty0 {
+ () => ( f() );
+}
+
+macro_rules! empty1 {
+ {} => { f() };
+}
+
+macro_rules! empty2 {
+ [] => [ f() ];
+}
+
+// using multiple parens/brackets/curlies variants allows us to make sure we
+// parse everything properly
+fn main() {
+ empty0!();
+ empty1!{};
+ empty2![];
+}
diff --git a/gcc/testsuite/rust/execute/xfail/macro2.rs b/gcc/testsuite/rust/execute/xfail/macro2.rs
new file mode 100644
index 0000000..49bd6a8
--- /dev/null
+++ b/gcc/testsuite/rust/execute/xfail/macro2.rs
@@ -0,0 +1,30 @@
+// { dg-output "arg\narg\n" }
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+fn f() {
+ let r_s = "arg\n\0";
+ let s_p = r_s as *const str;
+ let c_p = s_p as *const i8;
+
+ printf(c_p);
+}
+
+macro_rules! kw0 {
+ (keyword) => { f() };
+}
+
+macro_rules! kw1 {
+ (fn) => { f() };
+}
+
+macro_rules! kw2 {
+ (kw0 kw1 kw3) => { f() };
+}
+
+fn main() {
+ kw0!(keyword);
+ kw1!(fn);
+ kw2!(kw0 kw1 kw3);
+}
diff --git a/gcc/testsuite/rust/execute/xfail/macro3.rs b/gcc/testsuite/rust/execute/xfail/macro3.rs
new file mode 100644
index 0000000..0d99d716
--- /dev/null
+++ b/gcc/testsuite/rust/execute/xfail/macro3.rs
@@ -0,0 +1,45 @@
+// { dg-output "invok\ninvok\ninvok\ninvok\ninvok\n" }
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+fn f() {
+ let r_s = "invok\n\0";
+ let s_p = r_s as *const str;
+ let c_p = s_p as *const i8;
+
+ printf(c_p);
+}
+
+macro_rules! invocation0 {
+ (valid) => { f() };
+ () => { };
+}
+
+macro_rules! invocation1 {
+ (valid) => { };
+ () => { f() };
+}
+
+macro_rules! invocation2 {
+ (valid) => { f() };
+ (invalid) => { };
+}
+
+macro_rules! invocation3 {
+ (this is a valid invocation) => { f() };
+ (not this one) => { };
+}
+
+macro_rules! invocation4 {
+ (fn f() {}) => { f() };
+ (not a keyword) => { };
+}
+
+fn main() {
+ invocation0!(valid);
+ invocation1!();
+ invocation2!(valid);
+ invocation3!(this is a valid invocation);
+ invocation4!(fn f() {});
+}