diff options
| author | bors <bors@rust-lang.org> | 2019-12-30 02:05:24 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-12-30 02:05:24 +0000 |
| commit | 214548b8afd94924c17dea456c8077931009b944 (patch) | |
| tree | 9480be2547ff446587c3f0ed078b4127a6db9398 /src/test/ui | |
| parent | 2ba0d2acbd6cb01fb07619628882120d5b66bd59 (diff) | |
| parent | 5fd8abd2278624dd7e3b08a46a5599850c81b40d (diff) | |
Auto merge of #67631 - oli-obk:polymorphic_promotion, r=wesleywiser
Work around a resolve bug in const prop r? @wesleywiser @anp This isn't exposed right now, but further changes to rustc may start causing bugs without this.
Diffstat (limited to 'src/test/ui')
| -rw-r--r-- | src/test/ui/consts/trait_specialization.rs | 65 | ||||
| -rw-r--r-- | src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr | 5 |
2 files changed, 70 insertions, 0 deletions
diff --git a/src/test/ui/consts/trait_specialization.rs b/src/test/ui/consts/trait_specialization.rs new file mode 100644 index 00000000000..8010d2fe1ae --- /dev/null +++ b/src/test/ui/consts/trait_specialization.rs @@ -0,0 +1,65 @@ +// ignore-wasm32-bare which doesn't support `std::process:exit()` +// compile-flags: -Zmir-opt-level=2 +// run-pass + +// Tests that specialization does not cause optimizations running on polymorphic MIR to resolve +// to a `default` implementation. + +#![feature(specialization)] + +trait Marker {} + +trait SpecializedTrait { + const CONST_BOOL: bool; + const CONST_STR: &'static str; + fn method() -> &'static str; +} +impl <T> SpecializedTrait for T { + default const CONST_BOOL: bool = false; + default const CONST_STR: &'static str = "in default impl"; + #[inline(always)] + default fn method() -> &'static str { + "in default impl" + } +} +impl <T: Marker> SpecializedTrait for T { + const CONST_BOOL: bool = true; + const CONST_STR: &'static str = "in specialized impl"; + fn method() -> &'static str { + "in specialized impl" + } +} + +fn const_bool<T>() -> &'static str { + if <T as SpecializedTrait>::CONST_BOOL { + "in specialized impl" + } else { + "in default impl" + } +} +fn const_str<T>() -> &'static str { + <T as SpecializedTrait>::CONST_STR +} +fn run_method<T>() -> &'static str { + <T as SpecializedTrait>::method() +} + +struct TypeA; +impl Marker for TypeA {} +struct TypeB; + +#[inline(never)] +fn exit_if_not_eq(left: &str, right: &str) { + if left != right { + std::process::exit(1); + } +} + +pub fn main() { + exit_if_not_eq("in specialized impl", const_bool::<TypeA>()); + exit_if_not_eq("in default impl", const_bool::<TypeB>()); + exit_if_not_eq("in specialized impl", const_str::<TypeA>()); + exit_if_not_eq("in default impl", const_str::<TypeB>()); + exit_if_not_eq("in specialized impl", run_method::<TypeA>()); + exit_if_not_eq("in default impl", run_method::<TypeB>()); +} diff --git a/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr b/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr index dc4050e44ab..db535b53fcf 100644 --- a/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr +++ b/src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr @@ -4,6 +4,11 @@ error[E0391]: cycle detected when const-evaluating + checking `Alpha::V3::{{cons LL | V3 = Self::V1 {} as u8 + 2, | ^^^^^^^^ | +note: ...which requires const-evaluating + checking `Alpha::V3::{{constant}}#0`... + --> $DIR/self-in-enum-definition.rs:5:10 + | +LL | V3 = Self::V1 {} as u8 + 2, + | ^^^^^^^^ note: ...which requires const-evaluating `Alpha::V3::{{constant}}#0`... --> $DIR/self-in-enum-definition.rs:5:10 | |
