2016-10-03 20:28:44 +02:00
|
|
|
// 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.
|
|
|
|
|
|
|
|
|
|
|
|
// This test case tests the incremental compilation hash (ICH) implementation
|
|
|
|
// for function interfaces.
|
|
|
|
|
|
|
|
// The general pattern followed here is: Change one thing between rev1 and rev2
|
|
|
|
// and make sure that the hash has changed, then change nothing between rev2 and
|
|
|
|
// rev3 and make sure that the hash has not changed.
|
|
|
|
|
|
|
|
// must-compile-successfully
|
|
|
|
// revisions: cfail1 cfail2 cfail3
|
2017-12-04 12:47:16 +01:00
|
|
|
// compile-flags: -Z query-dep-graph -Zincremental-ignore-spans
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
#![allow(warnings)]
|
|
|
|
#![feature(intrinsics)]
|
|
|
|
#![feature(linkage)]
|
|
|
|
#![feature(rustc_attrs)]
|
2017-12-05 15:27:14 -08:00
|
|
|
#![crate_type = "rlib"]
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Add Parameter ---------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn add_parameter() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn add_parameter(p: i32) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Add Return Type -------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn add_return_type() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn add_return_type() -> () {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Change Parameter Type -------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_of_parameter(p: i32) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_of_parameter(p: i64) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Change Parameter Type Reference ---------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_of_parameter_ref(p: &i32) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_of_parameter_ref(p: &mut i32) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Change Parameter Order ------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn order_of_parameters(p1: i32, p2: i64) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn order_of_parameters(p2: i64, p1: i32) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Unsafe ----------------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn make_unsafe() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub unsafe fn make_unsafe() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Extern ----------------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn make_extern() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
|
|
|
pub extern "C" fn make_extern() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Extern C Extern Rust-Intrinsic ----------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub extern "C" fn make_intrinsic() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub extern "rust-intrinsic" fn make_intrinsic() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Type Parameter --------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_parameter() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, GenericsOfItem, TypeOfItem, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn type_parameter<T>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Lifetime Parameter ----------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn lifetime_parameter() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, GenericsOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn lifetime_parameter<'a>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Trait Bound -----------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn trait_bound<T>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn trait_bound<T: Eq>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Builtin Bound ---------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn builtin_bound<T>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn builtin_bound<T: Send>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Lifetime Bound --------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn lifetime_bound<'a, T>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, GenericsOfItem, TypeOfItem, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn lifetime_bound<'a, T: 'a>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Second Trait Bound ----------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_trait_bound<T: Eq>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_trait_bound<T: Eq + Clone>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Second Builtin Bound --------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_builtin_bound<T: Send>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_builtin_bound<T: Send + Sized>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Second Lifetime Bound -------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_lifetime_bound<'a, 'b, T: 'a>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, GenericsOfItem, TypeOfItem, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn second_lifetime_bound<'a, 'b, T: 'a + 'b>() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Inline ----------------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn inline() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2016-10-03 20:28:44 +02:00
|
|
|
#[inline]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn inline() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Inline Never ----------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2016-10-05 23:17:58 +02:00
|
|
|
#[inline(always)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn inline_never() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2016-10-03 20:28:44 +02:00
|
|
|
#[inline(never)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn inline_never() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// No Mangle -------------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn no_mangle() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2016-10-03 20:28:44 +02:00
|
|
|
#[no_mangle]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn no_mangle() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Linkage ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn linkage() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
|
|
|
#[linkage = "weak_odr"]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn linkage() {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Return Impl Trait -----------------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn return_impl_trait() -> i32 {
|
2016-10-03 20:28:44 +02:00
|
|
|
0
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn return_impl_trait() -> impl Clone {
|
2016-10-03 20:28:44 +02:00
|
|
|
0
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-10-05 23:17:58 +02:00
|
|
|
// Change Return Impl Trait ----------------------------------------------------
|
|
|
|
|
|
|
|
#[cfg(cfail1)]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn change_return_impl_trait() -> impl Clone {
|
2017-04-05 23:39:02 +02:00
|
|
|
0u32
|
2016-10-05 23:17:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(cfail1))]
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn change_return_impl_trait() -> impl Copy {
|
2017-04-05 23:39:02 +02:00
|
|
|
0u32
|
2016-10-05 23:17:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-10-03 20:28:44 +02:00
|
|
|
// Change Return Type Indirectly -----------------------------------------------
|
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub struct ReferencedType1;
|
|
|
|
pub struct ReferencedType2;
|
2016-10-03 20:28:44 +02:00
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub mod change_return_type_indirectly {
|
2016-10-03 20:28:44 +02:00
|
|
|
#[cfg(cfail1)]
|
|
|
|
use super::ReferencedType1 as ReturnType;
|
|
|
|
#[cfg(not(cfail1))]
|
|
|
|
use super::ReferencedType2 as ReturnType;
|
|
|
|
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn indirect_return_type() -> ReturnType {
|
2016-10-03 20:28:44 +02:00
|
|
|
ReturnType {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Change Parameter Type Indirectly --------------------------------------------
|
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub mod change_parameter_type_indirectly {
|
2016-10-03 20:28:44 +02:00
|
|
|
#[cfg(cfail1)]
|
|
|
|
use super::ReferencedType1 as ParameterType;
|
|
|
|
#[cfg(not(cfail1))]
|
|
|
|
use super::ReferencedType2 as ParameterType;
|
|
|
|
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2",
|
|
|
|
except = "Hir, HirBody, MirValidated, MirOptimized, TypeckTables, FnSignature")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn indirect_parameter_type(p: ParameterType) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Change Trait Bound Indirectly -----------------------------------------------
|
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub trait ReferencedTrait1 {}
|
|
|
|
pub trait ReferencedTrait2 {}
|
2016-10-03 20:28:44 +02:00
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub mod change_trait_bound_indirectly {
|
2016-10-03 20:28:44 +02:00
|
|
|
#[cfg(cfail1)]
|
|
|
|
use super::ReferencedTrait1 as Trait;
|
|
|
|
#[cfg(not(cfail1))]
|
|
|
|
use super::ReferencedTrait2 as Trait;
|
|
|
|
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
2017-12-05 14:40:13 -08:00
|
|
|
pub fn indirect_trait_bound<T: Trait>(p: T) {}
|
2016-10-03 20:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Change Trait Bound Indirectly In Where Clause -------------------------------
|
|
|
|
|
2017-12-05 14:40:13 -08:00
|
|
|
pub mod change_trait_bound_indirectly_in_where_clause {
|
2016-10-03 20:28:44 +02:00
|
|
|
#[cfg(cfail1)]
|
|
|
|
use super::ReferencedTrait1 as Trait;
|
|
|
|
#[cfg(not(cfail1))]
|
|
|
|
use super::ReferencedTrait2 as Trait;
|
|
|
|
|
2017-12-05 15:27:14 -08:00
|
|
|
#[rustc_clean(cfg = "cfail2", except = "Hir, HirBody, PredicatesOfItem")]
|
|
|
|
#[rustc_clean(cfg = "cfail3")]
|
|
|
|
pub fn indirect_trait_bound_where<T>(p: T)
|
|
|
|
where
|
|
|
|
T: Trait,
|
|
|
|
{
|
|
|
|
}
|
2016-10-03 20:28:44 +02:00
|
|
|
}
|