about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorCharles Lew <crlf0710@gmail.com>2021-07-17 15:44:19 +0800
committerCharles Lew <crlf0710@gmail.com>2021-07-20 22:14:43 +0800
commitab171c5279df8ed2449ca995c3e5402abc3cf8e9 (patch)
tree572e37198444bbfe7fd345d244d98428a0609b92 /src/test/ui
parentd2dc4276fdb5d5c4d8d7ff6906213db6c6ed4d7e (diff)
downloadrust-ab171c5279df8ed2449ca995c3e5402abc3cf8e9.tar.gz
rust-ab171c5279df8ed2449ca995c3e5402abc3cf8e9.zip
Add internal attribute and tests.
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/traits/vtable/vtable-diamond.rs39
-rw-r--r--src/test/ui/traits/vtable/vtable-diamond.stderr56
-rw-r--r--src/test/ui/traits/vtable/vtable-multiple.rs31
-rw-r--r--src/test/ui/traits/vtable/vtable-multiple.stderr44
4 files changed, 170 insertions, 0 deletions
diff --git a/src/test/ui/traits/vtable/vtable-diamond.rs b/src/test/ui/traits/vtable/vtable-diamond.rs
new file mode 100644
index 00000000000..ea26c60af72
--- /dev/null
+++ b/src/test/ui/traits/vtable/vtable-diamond.rs
@@ -0,0 +1,39 @@
+// build-fail
+//~^ error Vtable
+//~^^ error Vtable
+#![feature(rustc_attrs)]
+
+#[rustc_dump_vtable]
+trait A {
+    fn foo_a(&self) {}
+}
+
+#[rustc_dump_vtable]
+trait B: A {
+    fn foo_b(&self) {}
+}
+
+#[rustc_dump_vtable]
+trait C: A {
+    fn foo_c(&self) {}
+}
+
+#[rustc_dump_vtable]
+trait D: B + C {
+    fn foo_d(&self) {}
+}
+
+struct S;
+
+impl A for S {}
+impl B for S {}
+impl C for S {}
+impl D for S {}
+
+fn foo(d: &dyn D) {
+    d.foo_d();
+}
+
+fn main() {
+    foo(&S);
+}
diff --git a/src/test/ui/traits/vtable/vtable-diamond.stderr b/src/test/ui/traits/vtable/vtable-diamond.stderr
new file mode 100644
index 00000000000..582c8184107
--- /dev/null
+++ b/src/test/ui/traits/vtable/vtable-diamond.stderr
@@ -0,0 +1,56 @@
+error: Vtable Entries: [
+    MetadataDropInPlace,
+    MetadataSize,
+    MetadataAlign,
+    Method(
+        DefId(0:4 ~ vtable_diamond[4564]::A::foo_a),
+        [
+            S,
+        ],
+    ),
+    Method(
+        DefId(0:6 ~ vtable_diamond[4564]::B::foo_b),
+        [
+            S,
+        ],
+    ),
+    Method(
+        DefId(0:8 ~ vtable_diamond[4564]::C::foo_c),
+        [
+            S,
+        ],
+    ),
+    TraitVPtr(
+        Binder(
+            C,
+            [],
+        ),
+    ),
+    Method(
+        DefId(0:10 ~ vtable_diamond[4564]::D::foo_d),
+        [
+            S,
+        ],
+    ),
+]
+
+error: Vtable Entries: [
+    MetadataDropInPlace,
+    MetadataSize,
+    MetadataAlign,
+    Method(
+        DefId(0:4 ~ vtable_diamond[4564]::A::foo_a),
+        [
+            S,
+        ],
+    ),
+    Method(
+        DefId(0:8 ~ vtable_diamond[4564]::C::foo_c),
+        [
+            S,
+        ],
+    ),
+]
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/traits/vtable/vtable-multiple.rs b/src/test/ui/traits/vtable/vtable-multiple.rs
new file mode 100644
index 00000000000..d689ae96d41
--- /dev/null
+++ b/src/test/ui/traits/vtable/vtable-multiple.rs
@@ -0,0 +1,31 @@
+// build-fail
+//~^ error Vtable
+//~^^ error Vtable
+#![feature(rustc_attrs)]
+
+#[rustc_dump_vtable]
+trait A {
+    fn foo_a(&self) {}
+}
+
+#[rustc_dump_vtable]
+trait B {
+    fn foo_b(&self) {}
+}
+
+#[rustc_dump_vtable]
+trait C: A + B {
+    fn foo_c(&self) {}
+}
+
+struct S;
+
+impl A for S {}
+impl B for S {}
+impl C for S {}
+
+fn foo(c: &dyn C) {}
+
+fn main() {
+    foo(&S);
+}
diff --git a/src/test/ui/traits/vtable/vtable-multiple.stderr b/src/test/ui/traits/vtable/vtable-multiple.stderr
new file mode 100644
index 00000000000..222fe9cb0e4
--- /dev/null
+++ b/src/test/ui/traits/vtable/vtable-multiple.stderr
@@ -0,0 +1,44 @@
+error: Vtable Entries: [
+    MetadataDropInPlace,
+    MetadataSize,
+    MetadataAlign,
+    Method(
+        DefId(0:4 ~ vtable_multiple[5246]::A::foo_a),
+        [
+            S,
+        ],
+    ),
+    Method(
+        DefId(0:6 ~ vtable_multiple[5246]::B::foo_b),
+        [
+            S,
+        ],
+    ),
+    TraitVPtr(
+        Binder(
+            B,
+            [],
+        ),
+    ),
+    Method(
+        DefId(0:8 ~ vtable_multiple[5246]::C::foo_c),
+        [
+            S,
+        ],
+    ),
+]
+
+error: Vtable Entries: [
+    MetadataDropInPlace,
+    MetadataSize,
+    MetadataAlign,
+    Method(
+        DefId(0:6 ~ vtable_multiple[5246]::B::foo_b),
+        [
+            S,
+        ],
+    ),
+]
+
+error: aborting due to 2 previous errors
+