mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 20:28:33 +00:00
add tests for $crate in QSelf paths
This commit is contained in:
parent
b202bebdee
commit
d0c59e2c86
@ -16,6 +16,8 @@ extern crate proc_macro;
|
|||||||
|
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
// Outputs another copy of the struct. Useful for testing the tokens
|
||||||
|
// seen by the proc_macro.
|
||||||
#[proc_macro_derive(Double)]
|
#[proc_macro_derive(Double)]
|
||||||
pub fn derive(input: TokenStream) -> TokenStream {
|
pub fn derive(input: TokenStream) -> TokenStream {
|
||||||
format!("mod foo {{ {} }}", input.to_string()).parse().unwrap()
|
format!("mod foo {{ {} }}", input.to_string()).parse().unwrap()
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
// Copyright 2016 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.
|
||||||
|
|
||||||
|
pub struct ExternFoo;
|
||||||
|
|
||||||
|
pub trait ExternTrait {
|
||||||
|
const CONST: u32;
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ExternTrait for ExternFoo {
|
||||||
|
const CONST: u32 = 0;
|
||||||
|
type Assoc = ExternFoo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! external { () => {
|
||||||
|
mod bar {
|
||||||
|
#[derive(Double)]
|
||||||
|
struct Bar($crate::ExternFoo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself {
|
||||||
|
#[derive(Double)]
|
||||||
|
struct QSelf(<$crate::ExternFoo as $crate::ExternTrait>::Assoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself_recurse {
|
||||||
|
#[derive(Double)]
|
||||||
|
struct QSelfRecurse(<
|
||||||
|
<$crate::ExternFoo as $crate::ExternTrait>::Assoc
|
||||||
|
as $crate::ExternTrait>::Assoc
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself_in_const {
|
||||||
|
#[derive(Double)]
|
||||||
|
#[repr(u32)]
|
||||||
|
enum QSelfInConst {
|
||||||
|
Variant = <$crate::ExternFoo as $crate::ExternTrait>::CONST,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
|
@ -9,19 +9,63 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// aux-build:double.rs
|
// aux-build:double.rs
|
||||||
|
// aux-build:external-crate-var.rs
|
||||||
// ignore-stage1
|
// ignore-stage1
|
||||||
|
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate double;
|
extern crate double;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate external_crate_var;
|
||||||
|
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
macro_rules! m { () => {
|
trait Trait {
|
||||||
|
const CONST: u32;
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Trait for Foo {
|
||||||
|
const CONST: u32 = 0;
|
||||||
|
type Assoc = Foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! local { () => {
|
||||||
|
// derive_Double outputs secondary copies of each definition
|
||||||
|
// to test what the proc_macro sees.
|
||||||
|
mod bar {
|
||||||
#[derive(Double)]
|
#[derive(Double)]
|
||||||
struct Bar($crate::Foo);
|
struct Bar($crate::Foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself {
|
||||||
|
#[derive(Double)]
|
||||||
|
struct QSelf(<::Foo as $crate::Trait>::Assoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself_recurse {
|
||||||
|
#[derive(Double)]
|
||||||
|
struct QSelfRecurse(<<$crate::Foo as $crate::Trait>::Assoc as $crate::Trait>::Assoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
mod qself_in_const {
|
||||||
|
#[derive(Double)]
|
||||||
|
#[repr(u32)]
|
||||||
|
enum QSelfInConst {
|
||||||
|
Variant = <::Foo as $crate::Trait>::CONST,
|
||||||
|
}
|
||||||
|
}
|
||||||
} }
|
} }
|
||||||
m!();
|
|
||||||
|
mod local {
|
||||||
|
local!();
|
||||||
|
}
|
||||||
|
|
||||||
|
// and now repeat the above tests, using a macro defined in another crate
|
||||||
|
|
||||||
|
mod external {
|
||||||
|
external!{}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user