]> git.lizzy.rs Git - rust.git/commitdiff
typeck: always expose explicit enum discriminant `AnonConst`s' parent in `generics_of`.
authorEduard-Mihai Burtescu <edy.burt@gmail.com>
Sun, 5 Apr 2020 21:14:52 +0000 (00:14 +0300)
committerEduard-Mihai Burtescu <edy.burt@gmail.com>
Sat, 2 May 2020 16:51:44 +0000 (19:51 +0300)
src/librustc_typeck/collect.rs
src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.rs [new file with mode: 0644]
src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.stderr [new file with mode: 0644]
src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.rs [new file with mode: 0644]
src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.stderr [new file with mode: 0644]
src/test/ui/enum-discriminant/issue-70453-polymorphic-ctfe.rs [new file with mode: 0644]

index e6aa53dd4f3b7695396b5caee31e4464f8e0dcef..d01177e2fb561a7d5f96cc97e6aceeac7878f88d 100644 (file)
@@ -1178,9 +1178,11 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
                 let parent_node = tcx.hir().get(tcx.hir().get_parent_node(hir_id));
                 match parent_node {
                     // HACK(eddyb) this provides the correct generics for repeat
-                    // expressions' count (i.e. `N` in `[x; N]`), as they shouldn't
-                    // be able to cause query cycle errors.
+                    // expressions' count (i.e. `N` in `[x; N]`), and explicit
+                    // `enum` discriminants (i.e. `D` in `enum Foo { Bar = D }`),
+                    // as they shouldn't be able to cause query cycle errors.
                     Node::Expr(&Expr { kind: ExprKind::Repeat(_, ref constant), .. })
+                    | Node::Variant(Variant { disr_expr: Some(ref constant), .. })
                         if constant.hir_id == hir_id =>
                     {
                         Some(parent_def_id.to_def_id())
diff --git a/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.rs b/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.rs
new file mode 100644 (file)
index 0000000..0cfb93d
--- /dev/null
@@ -0,0 +1,16 @@
+#![feature(arbitrary_enum_discriminant, core_intrinsics)]
+
+extern crate core;
+use core::intrinsics::discriminant_value;
+
+#[repr(usize)]
+enum MyWeirdOption<T> {
+    None = 0,
+    Some(T) = std::mem::size_of::<T>(),
+    //~^ ERROR constant expression depends on a generic parameter
+}
+
+fn main() {
+    assert_eq!(discriminant_value(&MyWeirdOption::<u8>::None), 0);
+    assert_eq!(discriminant_value(&MyWeirdOption::Some(0u8)), 1);
+}
diff --git a/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.stderr b/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.stderr
new file mode 100644 (file)
index 0000000..91d488a
--- /dev/null
@@ -0,0 +1,10 @@
+error: constant expression depends on a generic parameter
+  --> $DIR/issue-70453-generics-in-discr-ice-2.rs:9:15
+   |
+LL |     Some(T) = std::mem::size_of::<T>(),
+   |               ^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.rs b/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.rs
new file mode 100644 (file)
index 0000000..676f111
--- /dev/null
@@ -0,0 +1,17 @@
+#![feature(core_intrinsics)]
+
+extern crate core;
+use core::intrinsics::discriminant_value;
+
+#[repr(usize)]
+enum MyWeirdOption<T> {
+//~^ ERROR parameter `T` is never used
+    None = 0,
+    Some = std::mem::size_of::<T>(),
+    //~^ ERROR constant expression depends on a generic parameter
+}
+
+fn main() {
+    assert_eq!(discriminant_value(&MyWeirdOption::<u8>::None), 0);
+    assert_eq!(discriminant_value(&MyWeirdOption::<u8>::Some), 1);
+}
diff --git a/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.stderr b/src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice.stderr
new file mode 100644 (file)
index 0000000..52e58aa
--- /dev/null
@@ -0,0 +1,19 @@
+error: constant expression depends on a generic parameter
+  --> $DIR/issue-70453-generics-in-discr-ice.rs:10:12
+   |
+LL |     Some = std::mem::size_of::<T>(),
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+
+error[E0392]: parameter `T` is never used
+  --> $DIR/issue-70453-generics-in-discr-ice.rs:7:20
+   |
+LL | enum MyWeirdOption<T> {
+   |                    ^ unused parameter
+   |
+   = help: consider removing `T`, referring to it in a field, or using a marker such as `std::marker::PhantomData`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0392`.
diff --git a/src/test/ui/enum-discriminant/issue-70453-polymorphic-ctfe.rs b/src/test/ui/enum-discriminant/issue-70453-polymorphic-ctfe.rs
new file mode 100644 (file)
index 0000000..05911a9
--- /dev/null
@@ -0,0 +1,17 @@
+// run-pass
+
+#![feature(arbitrary_enum_discriminant, core_intrinsics)]
+
+extern crate core;
+use core::intrinsics::discriminant_value;
+
+#[repr(usize)]
+enum MyWeirdOption<T> {
+    None = 0,
+    Some(T) = core::mem::size_of::<*mut T>(),
+}
+
+fn main() {
+    assert_eq!(discriminant_value(&MyWeirdOption::<()>::None), 0);
+    assert_eq!(discriminant_value(&MyWeirdOption::Some(())), core::mem::size_of::<usize>() as u64);
+}