Add compile-file/macro-backtrace-{invalid-internals,nested,println} tests

This commit is contained in:
Ryan Prichard 2015-04-03 19:58:41 -07:00
parent a893c646d0
commit 5a8f102bf6
3 changed files with 115 additions and 0 deletions

View File

@ -0,0 +1,57 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Macros in statement vs expression position handle backtraces differently.
macro_rules! fake_method_stmt { //~ NOTE in expansion of
() => {
1.fake() //~ ERROR does not implement any method
}
}
macro_rules! fake_field_stmt { //~ NOTE in expansion of
() => {
1.fake //~ ERROR no field with that name
}
}
macro_rules! fake_anon_field_stmt { //~ NOTE in expansion of
() => {
(1).0 //~ ERROR type was not a tuple
}
}
macro_rules! fake_method_expr { //~ NOTE in expansion of
() => {
1.fake() //~ ERROR does not implement any method
}
}
macro_rules! fake_field_expr {
() => {
1.fake
}
}
macro_rules! fake_anon_field_expr {
() => {
(1).0
}
}
fn main() {
fake_method_stmt!(); //~ NOTE expansion site
fake_field_stmt!(); //~ NOTE expansion site
fake_anon_field_stmt!(); //~ NOTE expansion site
let _ = fake_method_expr!(); //~ NOTE expansion site
let _ = fake_field_expr!(); //~ ERROR no field with that name
let _ = fake_anon_field_expr!(); //~ ERROR type was not a tuple
}

View File

@ -0,0 +1,29 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// In expression position, but not statement position, when we expand a macro,
// we replace the span of the expanded expression with that of the call site.
macro_rules! nested_expr {
() => (fake)
}
macro_rules! call_nested_expr {
() => (nested_expr!())
}
macro_rules! call_nested_expr_sum { //~ NOTE in expansion of
() => { 1 + nested_expr!(); } //~ ERROR unresolved name
}
fn main() {
1 + call_nested_expr!(); //~ ERROR unresolved name
call_nested_expr_sum!(); //~ NOTE expansion site
}

View File

@ -0,0 +1,29 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// The `format_args!` syntax extension issues errors before code expansion
// has completed, but we still need a backtrace.
// This test includes stripped-down versions of `print!` and `println!`,
// because we can't otherwise verify the lines of the backtrace.
fn print(_args: std::fmt::Arguments) {}
macro_rules! myprint { //~ NOTE in expansion of
($($arg:tt)*) => (print(format_args!($($arg)*)));
}
macro_rules! myprintln { //~ NOTE in expansion of
($fmt:expr) => (myprint!(concat!($fmt, "\n"))); //~ ERROR invalid reference to argument `0`
}
fn main() {
myprintln!("{}"); //~ NOTE expansion site
}