about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-12-30 02:05:24 +0000
committerbors <bors@rust-lang.org>2019-12-30 02:05:24 +0000
commit214548b8afd94924c17dea456c8077931009b944 (patch)
tree9480be2547ff446587c3f0ed078b4127a6db9398 /src/test/ui
parent2ba0d2acbd6cb01fb07619628882120d5b66bd59 (diff)
parent5fd8abd2278624dd7e3b08a46a5599850c81b40d (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.rs65
-rw-r--r--src/test/ui/type-alias-enum-variants/self-in-enum-definition.stderr5
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
    |