diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-02-16 09:48:58 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 09:48:58 +0000 |
commit | 330b265134afd12e06884205e7b77334393864b8 (patch) | |
tree | 8efd84f917a1a684e0813b55c552f140e89337d2 | |
parent | c7275a7fb89f324e7cd7881d12a49287a89f1c74 (diff) | |
parent | 08dbb4e32263e611691dc73519b95a97e638fb41 (diff) | |
download | gcc-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.rs | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro2.rs | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro3.rs | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro4.rs | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro5.rs | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/xfail/macro1.rs | 32 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/xfail/macro2.rs | 30 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/xfail/macro3.rs | 45 |
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() {}); +} |