summaryrefslogtreecommitdiffstats
path: root/tests/ui/offset-of
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
commit9835e2ae736235810b4ea1c162ca5e65c547e770 (patch)
tree3fcebf40ed70e581d776a8a4c65923e8ec20e026 /tests/ui/offset-of
parentReleasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff)
downloadrustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz
rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/offset-of')
-rw-r--r--tests/ui/offset-of/auxiliary/offset-of-staged-api.rs33
-rw-r--r--tests/ui/offset-of/offset-of-arg-count.rs22
-rw-r--r--tests/ui/offset-of/offset-of-arg-count.stderr59
-rw-r--r--tests/ui/offset-of/offset-of-builtin.rs44
-rw-r--r--tests/ui/offset-of/offset-of-builtin.stderr65
-rw-r--r--tests/ui/offset-of/offset-of-dst-field.rs49
-rw-r--r--tests/ui/offset-of/offset-of-dst-field.stderr77
-rw-r--r--tests/ui/offset-of/offset-of-enum.rs13
-rw-r--r--tests/ui/offset-of/offset-of-enum.stderr19
-rw-r--r--tests/ui/offset-of/offset-of-inference.rs11
-rw-r--r--tests/ui/offset-of/offset-of-inference.stderr9
-rw-r--r--tests/ui/offset-of/offset-of-output-type.rs20
-rw-r--r--tests/ui/offset-of/offset-of-output-type.stderr64
-rw-r--r--tests/ui/offset-of/offset-of-private.rs28
-rw-r--r--tests/ui/offset-of/offset-of-private.stderr46
-rw-r--r--tests/ui/offset-of/offset-of-self.rs58
-rw-r--r--tests/ui/offset-of/offset-of-self.stderr79
-rw-r--r--tests/ui/offset-of/offset-of-unstable-with-feature.rs20
-rw-r--r--tests/ui/offset-of/offset-of-unstable.rs31
-rw-r--r--tests/ui/offset-of/offset-of-unstable.stderr84
20 files changed, 831 insertions, 0 deletions
diff --git a/tests/ui/offset-of/auxiliary/offset-of-staged-api.rs b/tests/ui/offset-of/auxiliary/offset-of-staged-api.rs
new file mode 100644
index 000000000..088086cc5
--- /dev/null
+++ b/tests/ui/offset-of/auxiliary/offset-of-staged-api.rs
@@ -0,0 +1,33 @@
+#![crate_type = "lib"]
+#![feature(staged_api)]
+#![stable(feature = "stable_test_feature", since = "1.0")]
+
+#[unstable(feature = "unstable_test_feature", issue = "none")]
+pub struct Unstable {
+ #[unstable(feature = "unstable_test_feature", issue = "none")]
+ pub unstable: u8,
+}
+
+#[stable(feature = "stable_test_feature", since = "1.0")]
+pub struct Stable {
+ #[stable(feature = "stable_test_feature", since = "1.0")]
+ pub stable: u8,
+}
+
+#[stable(feature = "stable_test_feature", since = "1.0")]
+pub struct StableWithUnstableField {
+ #[unstable(feature = "unstable_test_feature", issue = "none")]
+ pub unstable: u8,
+}
+
+#[stable(feature = "stable_test_feature", since = "1.0")]
+pub struct StableWithUnstableFieldType {
+ #[stable(feature = "stable_test_feature", since = "1.0")]
+ pub stable: Unstable,
+}
+
+#[unstable(feature = "unstable_test_feature", issue = "none")]
+pub struct UnstableWithStableFieldType {
+ #[unstable(feature = "unstable_test_feature", issue = "none")]
+ pub unstable: Stable,
+}
diff --git a/tests/ui/offset-of/offset-of-arg-count.rs b/tests/ui/offset-of/offset-of-arg-count.rs
new file mode 100644
index 000000000..31de45bc7
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-arg-count.rs
@@ -0,0 +1,22 @@
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+fn main() {
+ offset_of!(NotEnoughArguments); //~ ERROR unexpected end of macro invocation
+ offset_of!(NotEnoughArgumentsWithAComma, ); //~ ERROR unexpected end of macro invocation
+ offset_of!(Container, field, too many arguments); //~ ERROR no rules expected the token `too`
+ offset_of!(S, f); // compiles fine
+ offset_of!(S, f,); // also compiles fine
+ offset_of!(S, f.); //~ ERROR unexpected end of macro invocation
+ offset_of!(S, f.,); //~ ERROR expected identifier
+ offset_of!(S, f..); //~ ERROR no rules expected the token
+ offset_of!(S, f..,); //~ ERROR no rules expected the token
+ offset_of!(Lt<'static>, bar); // issue #111657
+ offset_of!(Lt<'_>, bar); // issue #111678
+}
+
+struct S { f: u8, }
+struct Lt<'a> {
+ bar: &'a (),
+}
diff --git a/tests/ui/offset-of/offset-of-arg-count.stderr b/tests/ui/offset-of/offset-of-arg-count.stderr
new file mode 100644
index 000000000..4275a8954
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-arg-count.stderr
@@ -0,0 +1,59 @@
+error: unexpected end of macro invocation
+ --> $DIR/offset-of-arg-count.rs:6:34
+ |
+LL | offset_of!(NotEnoughArguments);
+ | ^ missing tokens in macro arguments
+ |
+note: while trying to match `,`
+ --> $SRC_DIR/core/src/mem/mod.rs:LL:COL
+
+error: unexpected end of macro invocation
+ --> $DIR/offset-of-arg-count.rs:7:45
+ |
+LL | offset_of!(NotEnoughArgumentsWithAComma, );
+ | ^ missing tokens in macro arguments
+ |
+note: while trying to match meta-variable `$fields:tt`
+ --> $SRC_DIR/core/src/mem/mod.rs:LL:COL
+
+error: no rules expected the token `too`
+ --> $DIR/offset-of-arg-count.rs:8:34
+ |
+LL | offset_of!(Container, field, too many arguments);
+ | ^^^ no rules expected this token in macro call
+ |
+ = note: while trying to match sequence end
+
+error: unexpected end of macro invocation
+ --> $DIR/offset-of-arg-count.rs:11:21
+ |
+LL | offset_of!(S, f.);
+ | ^ missing tokens in macro arguments
+ |
+note: while trying to match meta-variable `$fields:tt`
+ --> $SRC_DIR/core/src/mem/mod.rs:LL:COL
+
+error: expected identifier, found `,`
+ --> $DIR/offset-of-arg-count.rs:12:21
+ |
+LL | offset_of!(S, f.,);
+ | ^ expected identifier
+
+error: no rules expected the token `..`
+ --> $DIR/offset-of-arg-count.rs:13:20
+ |
+LL | offset_of!(S, f..);
+ | ^^ no rules expected this token in macro call
+ |
+ = note: while trying to match sequence start
+
+error: no rules expected the token `..`
+ --> $DIR/offset-of-arg-count.rs:14:20
+ |
+LL | offset_of!(S, f..,);
+ | ^^ no rules expected this token in macro call
+ |
+ = note: while trying to match sequence start
+
+error: aborting due to 7 previous errors
+
diff --git a/tests/ui/offset-of/offset-of-builtin.rs b/tests/ui/offset-of/offset-of-builtin.rs
new file mode 100644
index 000000000..1be989988
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-builtin.rs
@@ -0,0 +1,44 @@
+#![feature(builtin_syntax)]
+
+// For the exposed macro we already test these errors in the other files,
+// but this test helps to make sure the builtin construct also errors.
+// This has the same examples as offset-of-arg-count.rs
+
+fn main() {
+ builtin # offset_of(NotEnoughArguments); //~ ERROR expected one of
+}
+fn t1() {
+ // Already errored upon at the macro level. Yielding an error would require
+ // extra effort.
+ builtin # offset_of(NotEnoughArgumentsWithAComma, );
+}
+fn t2() {
+ builtin # offset_of(Container, field, too many arguments); //~ ERROR expected identifier, found
+ //~| ERROR found `,`
+ //~| ERROR found `many`
+ //~| ERROR found `arguments`
+}
+fn t3() {
+ builtin # offset_of(S, f); // compiles fine
+}
+fn t4() {
+ // Already errored upon at the macro level. Yielding an error would require
+ // extra effort.
+ builtin # offset_of(S, f);
+}
+fn t5() {
+ builtin # offset_of(S, f.); //~ ERROR expected identifier
+}
+fn t6() {
+ builtin # offset_of(S, f.,); //~ ERROR expected identifier
+}
+fn t7() {
+ builtin # offset_of(S, f..); //~ ERROR expected one of
+}
+fn t8() {
+ // Already errored upon at the macro level. Yielding an error would require
+ // extra effort.
+ builtin # offset_of(S, f..,);
+}
+
+struct S { f: u8, }
diff --git a/tests/ui/offset-of/offset-of-builtin.stderr b/tests/ui/offset-of/offset-of-builtin.stderr
new file mode 100644
index 000000000..1a1f33cc6
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-builtin.stderr
@@ -0,0 +1,65 @@
+error: expected one of `!`, `(`, `+`, `,`, `::`, or `<`, found `)`
+ --> $DIR/offset-of-builtin.rs:8:43
+ |
+LL | builtin # offset_of(NotEnoughArguments);
+ | ^ expected one of `!`, `(`, `+`, `,`, `::`, or `<`
+
+error: expected identifier, found `,`
+ --> $DIR/offset-of-builtin.rs:16:41
+ |
+LL | builtin # offset_of(Container, field, too many arguments);
+ | ^
+ | |
+ | expected identifier
+ | help: remove this comma
+
+error: expected one of `)` or `.`, found `,`
+ --> $DIR/offset-of-builtin.rs:16:41
+ |
+LL | builtin # offset_of(Container, field, too many arguments);
+ | ^
+ | |
+ | expected one of `)` or `.`
+ | help: missing `.`
+
+error: expected one of `)` or `.`, found `many`
+ --> $DIR/offset-of-builtin.rs:16:47
+ |
+LL | builtin # offset_of(Container, field, too many arguments);
+ | -^^^^ expected one of `)` or `.`
+ | |
+ | help: missing `.`
+
+error: expected one of `)` or `.`, found `arguments`
+ --> $DIR/offset-of-builtin.rs:16:52
+ |
+LL | builtin # offset_of(Container, field, too many arguments);
+ | -^^^^^^^^^ expected one of `)` or `.`
+ | |
+ | help: missing `.`
+
+error: expected identifier, found `)`
+ --> $DIR/offset-of-builtin.rs:30:30
+ |
+LL | builtin # offset_of(S, f.);
+ | ^ expected identifier
+
+error: expected identifier, found `,`
+ --> $DIR/offset-of-builtin.rs:33:30
+ |
+LL | builtin # offset_of(S, f.,);
+ | ^ expected identifier
+
+error: expected one of `)` or `.`, found `..`
+ --> $DIR/offset-of-builtin.rs:36:29
+ |
+LL | builtin # offset_of(S, f..);
+ | ^^ expected one of `)` or `.`
+ |
+help: if you meant to bind the contents of the rest of the array pattern into `f`, use `@`
+ |
+LL | builtin # offset_of(S, f @ ..);
+ | +
+
+error: aborting due to 8 previous errors
+
diff --git a/tests/ui/offset-of/offset-of-dst-field.rs b/tests/ui/offset-of/offset-of-dst-field.rs
new file mode 100644
index 000000000..3b8dc0b84
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-dst-field.rs
@@ -0,0 +1,49 @@
+#![feature(offset_of, extern_types)]
+
+use std::mem::offset_of;
+
+struct Alpha {
+ x: u8,
+ y: u16,
+ z: [u8],
+}
+
+trait Trait {}
+
+struct Beta {
+ x: u8,
+ y: u16,
+ z: dyn Trait,
+}
+
+extern {
+ type Extern;
+}
+
+struct Gamma {
+ x: u8,
+ y: u16,
+ z: Extern,
+}
+
+struct Delta<T: ?Sized> {
+ x: u8,
+ y: u16,
+ z: T,
+}
+
+fn main() {
+ offset_of!(Alpha, z); //~ ERROR the size for values of type
+ offset_of!(Beta, z); //~ ERROR the size for values of type
+ offset_of!(Gamma, z); //~ ERROR the size for values of type
+}
+
+fn delta() {
+ offset_of!(Delta<Alpha>, z); //~ ERROR the size for values of type
+ offset_of!(Delta<Extern>, z); //~ ERROR the size for values of type
+ offset_of!(Delta<dyn Trait>, z); //~ ERROR the size for values of type
+}
+
+fn generic_with_maybe_sized<T: ?Sized>() -> usize {
+ offset_of!(Delta<T>, z) //~ ERROR the size for values of type
+}
diff --git a/tests/ui/offset-of/offset-of-dst-field.stderr b/tests/ui/offset-of/offset-of-dst-field.stderr
new file mode 100644
index 000000000..128c783d5
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-dst-field.stderr
@@ -0,0 +1,77 @@
+error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:36:5
+ |
+LL | offset_of!(Alpha, z);
+ | ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `[u8]`
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:37:5
+ |
+LL | offset_of!(Beta, z);
+ | ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `(dyn Trait + 'static)`
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `Extern` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:38:5
+ |
+LL | offset_of!(Gamma, z);
+ | ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `Extern`
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `Extern` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:43:5
+ |
+LL | offset_of!(Delta<Extern>, z);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `Extern`
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:44:5
+ |
+LL | offset_of!(Delta<dyn Trait>, z);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `Sized` is not implemented for `dyn Trait`
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:42:5
+ |
+LL | offset_of!(Delta<Alpha>, z);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = help: within `Alpha`, the trait `Sized` is not implemented for `[u8]`
+note: required because it appears within the type `Alpha`
+ --> $DIR/offset-of-dst-field.rs:5:8
+ |
+LL | struct Alpha {
+ | ^^^^^
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0277]: the size for values of type `T` cannot be known at compilation time
+ --> $DIR/offset-of-dst-field.rs:48:5
+ |
+LL | fn generic_with_maybe_sized<T: ?Sized>() -> usize {
+ | - this type parameter needs to be `std::marker::Sized`
+LL | offset_of!(Delta<T>, z)
+ | ^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider removing the `?Sized` bound to make the type parameter `Sized`
+ |
+LL - fn generic_with_maybe_sized<T: ?Sized>() -> usize {
+LL + fn generic_with_maybe_sized<T>() -> usize {
+ |
+
+error: aborting due to 7 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/offset-of/offset-of-enum.rs b/tests/ui/offset-of/offset-of-enum.rs
new file mode 100644
index 000000000..d73505821
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-enum.rs
@@ -0,0 +1,13 @@
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+enum Alpha {
+ One(u8),
+ Two(u8),
+}
+
+fn main() {
+ offset_of!(Alpha::One, 0); //~ ERROR expected type, found variant `Alpha::One`
+ offset_of!(Alpha, Two.0); //~ ERROR no field `Two` on type `Alpha`
+}
diff --git a/tests/ui/offset-of/offset-of-enum.stderr b/tests/ui/offset-of/offset-of-enum.stderr
new file mode 100644
index 000000000..6958d199f
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-enum.stderr
@@ -0,0 +1,19 @@
+error[E0573]: expected type, found variant `Alpha::One`
+ --> $DIR/offset-of-enum.rs:11:16
+ |
+LL | offset_of!(Alpha::One, 0);
+ | ^^^^^^^^^^
+ | |
+ | not a type
+ | help: try using the variant's enum: `Alpha`
+
+error[E0609]: no field `Two` on type `Alpha`
+ --> $DIR/offset-of-enum.rs:12:23
+ |
+LL | offset_of!(Alpha, Two.0);
+ | ^^^
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0573, E0609.
+For more information about an error, try `rustc --explain E0573`.
diff --git a/tests/ui/offset-of/offset-of-inference.rs b/tests/ui/offset-of/offset-of-inference.rs
new file mode 100644
index 000000000..ba87574ea
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-inference.rs
@@ -0,0 +1,11 @@
+// Test that inference types in `offset_of!` don't ICE.
+
+#![feature(offset_of)]
+
+struct Foo<T> {
+ x: T,
+}
+
+fn main() {
+ let _ = core::mem::offset_of!(Foo<_>, x); //~ ERROR: type annotations needed
+}
diff --git a/tests/ui/offset-of/offset-of-inference.stderr b/tests/ui/offset-of/offset-of-inference.stderr
new file mode 100644
index 000000000..2a520f6f9
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-inference.stderr
@@ -0,0 +1,9 @@
+error[E0282]: type annotations needed
+ --> $DIR/offset-of-inference.rs:10:35
+ |
+LL | let _ = core::mem::offset_of!(Foo<_>, x);
+ | ^^^^^^ cannot infer type
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0282`.
diff --git a/tests/ui/offset-of/offset-of-output-type.rs b/tests/ui/offset-of/offset-of-output-type.rs
new file mode 100644
index 000000000..50c2e9384
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-output-type.rs
@@ -0,0 +1,20 @@
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+struct S {
+ v: u8,
+ w: u16,
+}
+
+
+fn main() {
+ let _: u8 = offset_of!(S, v); //~ ERROR mismatched types
+ let _: u16 = offset_of!(S, v); //~ ERROR mismatched types
+ let _: u32 = offset_of!(S, v); //~ ERROR mismatched types
+ let _: u64 = offset_of!(S, v); //~ ERROR mismatched types
+ let _: isize = offset_of!(S, v); //~ ERROR mismatched types
+ let _: usize = offset_of!(S, v);
+
+ offset_of!(S, v) //~ ERROR mismatched types
+}
diff --git a/tests/ui/offset-of/offset-of-output-type.stderr b/tests/ui/offset-of/offset-of-output-type.stderr
new file mode 100644
index 000000000..6f8c94750
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-output-type.stderr
@@ -0,0 +1,64 @@
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:12:17
+ |
+LL | let _: u8 = offset_of!(S, v);
+ | -- ^^^^^^^^^^^^^^^^ expected `u8`, found `usize`
+ | |
+ | expected due to this
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:13:18
+ |
+LL | let _: u16 = offset_of!(S, v);
+ | --- ^^^^^^^^^^^^^^^^ expected `u16`, found `usize`
+ | |
+ | expected due to this
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:14:18
+ |
+LL | let _: u32 = offset_of!(S, v);
+ | --- ^^^^^^^^^^^^^^^^ expected `u32`, found `usize`
+ | |
+ | expected due to this
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:15:18
+ |
+LL | let _: u64 = offset_of!(S, v);
+ | --- ^^^^^^^^^^^^^^^^ expected `u64`, found `usize`
+ | |
+ | expected due to this
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:16:20
+ |
+LL | let _: isize = offset_of!(S, v);
+ | ----- ^^^^^^^^^^^^^^^^ expected `isize`, found `usize`
+ | |
+ | expected due to this
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0308]: mismatched types
+ --> $DIR/offset-of-output-type.rs:19:5
+ |
+LL | fn main() {
+ | - expected `()` because of default return type
+...
+LL | offset_of!(S, v)
+ | ^^^^^^^^^^^^^^^^ expected `()`, found `usize`
+ |
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 6 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/offset-of/offset-of-private.rs b/tests/ui/offset-of/offset-of-private.rs
new file mode 100644
index 000000000..6b1a16ba6
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-private.rs
@@ -0,0 +1,28 @@
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+mod m {
+ #[repr(C)]
+ pub struct Foo {
+ pub public: u8,
+ private: u8,
+ }
+ #[repr(C)]
+ pub struct FooTuple(pub u8, u8);
+ #[repr(C)]
+ struct Bar {
+ pub public: u8,
+ private: u8,
+ }
+}
+
+fn main() {
+ offset_of!(m::Foo, public);
+ offset_of!(m::Foo, private); //~ ERROR field `private` of struct `Foo` is private
+ offset_of!(m::FooTuple, 0);
+ offset_of!(m::FooTuple, 1); //~ ERROR field `1` of struct `FooTuple` is private
+ offset_of!(m::Bar, public); //~ ERROR struct `Bar` is private
+ offset_of!(m::Bar, private); //~ ERROR struct `Bar` is private
+ //~| ERROR field `private` of struct `Bar` is private
+}
diff --git a/tests/ui/offset-of/offset-of-private.stderr b/tests/ui/offset-of/offset-of-private.stderr
new file mode 100644
index 000000000..0674b58f8
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-private.stderr
@@ -0,0 +1,46 @@
+error[E0603]: struct `Bar` is private
+ --> $DIR/offset-of-private.rs:25:19
+ |
+LL | offset_of!(m::Bar, public);
+ | ^^^ private struct
+ |
+note: the struct `Bar` is defined here
+ --> $DIR/offset-of-private.rs:14:5
+ |
+LL | struct Bar {
+ | ^^^^^^^^^^
+
+error[E0603]: struct `Bar` is private
+ --> $DIR/offset-of-private.rs:26:19
+ |
+LL | offset_of!(m::Bar, private);
+ | ^^^ private struct
+ |
+note: the struct `Bar` is defined here
+ --> $DIR/offset-of-private.rs:14:5
+ |
+LL | struct Bar {
+ | ^^^^^^^^^^
+
+error[E0616]: field `private` of struct `Foo` is private
+ --> $DIR/offset-of-private.rs:22:24
+ |
+LL | offset_of!(m::Foo, private);
+ | ^^^^^^^ private field
+
+error[E0616]: field `1` of struct `FooTuple` is private
+ --> $DIR/offset-of-private.rs:24:29
+ |
+LL | offset_of!(m::FooTuple, 1);
+ | ^ private field
+
+error[E0616]: field `private` of struct `Bar` is private
+ --> $DIR/offset-of-private.rs:26:24
+ |
+LL | offset_of!(m::Bar, private);
+ | ^^^^^^^ private field
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0603, E0616.
+For more information about an error, try `rustc --explain E0603`.
diff --git a/tests/ui/offset-of/offset-of-self.rs b/tests/ui/offset-of/offset-of-self.rs
new file mode 100644
index 000000000..dbeef0e74
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-self.rs
@@ -0,0 +1,58 @@
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+struct C<T> {
+ v: T,
+ w: T,
+}
+
+struct S {
+ v: u8,
+ w: u16,
+}
+
+impl S {
+ fn v_offs() -> usize {
+ offset_of!(Self, v)
+ }
+ fn v_offs_wrong_syntax() {
+ offset_of!(Self, Self::v); //~ ERROR no rules expected the token `::`
+ offset_of!(S, Self); //~ ERROR expected identifier, found keyword `Self`
+ //~| no field `Self` on type `S`
+ }
+ fn offs_in_c() -> usize {
+ offset_of!(C<Self>, w)
+ }
+ fn offs_in_c_colon() -> usize {
+ offset_of!(C::<Self>, w)
+ }
+}
+
+mod m {
+ use std::mem::offset_of;
+ fn off() {
+ offset_of!(self::S, v); //~ ERROR cannot find type `S` in module
+ offset_of!(super::S, v);
+ offset_of!(crate::S, v);
+ }
+ impl super::n::T {
+ fn v_offs_self() -> usize {
+ offset_of!(Self, v) //~ ERROR field `v` of struct `T` is private
+ }
+ }
+}
+
+mod n {
+ pub struct T { v: u8, }
+}
+
+fn main() {
+ offset_of!(self::S, v);
+ offset_of!(Self, v); //~ ERROR cannot find type `Self` in this scope
+
+ offset_of!(S, self); //~ ERROR expected identifier, found keyword `self`
+ //~| no field `self` on type `S`
+ offset_of!(S, v.self); //~ ERROR expected identifier, found keyword `self`
+ //~| no field `self` on type `u8`
+}
diff --git a/tests/ui/offset-of/offset-of-self.stderr b/tests/ui/offset-of/offset-of-self.stderr
new file mode 100644
index 000000000..df555463f
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-self.stderr
@@ -0,0 +1,79 @@
+error: no rules expected the token `::`
+ --> $DIR/offset-of-self.rs:20:30
+ |
+LL | offset_of!(Self, Self::v);
+ | ^^ no rules expected this token in macro call
+ |
+ = note: while trying to match sequence start
+
+error: expected identifier, found keyword `Self`
+ --> $DIR/offset-of-self.rs:21:23
+ |
+LL | offset_of!(S, Self);
+ | ^^^^ expected identifier, found keyword
+
+error: expected identifier, found keyword `self`
+ --> $DIR/offset-of-self.rs:54:19
+ |
+LL | offset_of!(S, self);
+ | ^^^^ expected identifier, found keyword
+
+error: expected identifier, found keyword `self`
+ --> $DIR/offset-of-self.rs:56:21
+ |
+LL | offset_of!(S, v.self);
+ | ^^^^ expected identifier, found keyword
+
+error[E0412]: cannot find type `S` in module `self`
+ --> $DIR/offset-of-self.rs:35:26
+ |
+LL | offset_of!(self::S, v);
+ | ^ not found in `self`
+ |
+help: consider importing this struct
+ |
+LL + use S;
+ |
+help: if you import `S`, refer to it directly
+ |
+LL - offset_of!(self::S, v);
+LL + offset_of!(S, v);
+ |
+
+error[E0411]: cannot find type `Self` in this scope
+ --> $DIR/offset-of-self.rs:52:16
+ |
+LL | fn main() {
+ | ---- `Self` not allowed in a function
+LL | offset_of!(self::S, v);
+LL | offset_of!(Self, v);
+ | ^^^^ `Self` is only available in impls, traits, and type definitions
+
+error[E0609]: no field `Self` on type `S`
+ --> $DIR/offset-of-self.rs:21:23
+ |
+LL | offset_of!(S, Self);
+ | ^^^^
+
+error[E0616]: field `v` of struct `T` is private
+ --> $DIR/offset-of-self.rs:41:30
+ |
+LL | offset_of!(Self, v)
+ | ^ private field
+
+error[E0609]: no field `self` on type `S`
+ --> $DIR/offset-of-self.rs:54:19
+ |
+LL | offset_of!(S, self);
+ | ^^^^
+
+error[E0609]: no field `self` on type `u8`
+ --> $DIR/offset-of-self.rs:56:21
+ |
+LL | offset_of!(S, v.self);
+ | ^^^^
+
+error: aborting due to 10 previous errors
+
+Some errors have detailed explanations: E0411, E0412, E0609, E0616.
+For more information about an error, try `rustc --explain E0411`.
diff --git a/tests/ui/offset-of/offset-of-unstable-with-feature.rs b/tests/ui/offset-of/offset-of-unstable-with-feature.rs
new file mode 100644
index 000000000..7d2eb46c0
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-unstable-with-feature.rs
@@ -0,0 +1,20 @@
+// check-pass
+// aux-build:offset-of-staged-api.rs
+
+#![feature(offset_of, unstable_test_feature)]
+
+use std::mem::offset_of;
+
+extern crate offset_of_staged_api;
+
+use offset_of_staged_api::*;
+
+fn main() {
+ offset_of!(Unstable, unstable);
+ offset_of!(Stable, stable);
+ offset_of!(StableWithUnstableField, unstable);
+ offset_of!(StableWithUnstableFieldType, stable);
+ offset_of!(StableWithUnstableFieldType, stable.unstable);
+ offset_of!(UnstableWithStableFieldType, unstable);
+ offset_of!(UnstableWithStableFieldType, unstable.stable);
+}
diff --git a/tests/ui/offset-of/offset-of-unstable.rs b/tests/ui/offset-of/offset-of-unstable.rs
new file mode 100644
index 000000000..1e19f2091
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-unstable.rs
@@ -0,0 +1,31 @@
+// aux-build:offset-of-staged-api.rs
+
+#![feature(offset_of)]
+
+use std::mem::offset_of;
+
+extern crate offset_of_staged_api;
+
+use offset_of_staged_api::*;
+
+fn main() {
+ offset_of!(
+ //~^ ERROR use of unstable library feature
+ Unstable, //~ ERROR use of unstable library feature
+ unstable
+ );
+ offset_of!(Stable, stable);
+ offset_of!(StableWithUnstableField, unstable); //~ ERROR use of unstable library feature
+ offset_of!(StableWithUnstableFieldType, stable);
+ offset_of!(StableWithUnstableFieldType, stable.unstable); //~ ERROR use of unstable library feature
+ offset_of!(
+ //~^ ERROR use of unstable library feature
+ UnstableWithStableFieldType, //~ ERROR use of unstable library feature
+ unstable
+ );
+ offset_of!(
+ //~^ ERROR use of unstable library feature
+ UnstableWithStableFieldType, //~ ERROR use of unstable library feature
+ unstable.stable
+ );
+}
diff --git a/tests/ui/offset-of/offset-of-unstable.stderr b/tests/ui/offset-of/offset-of-unstable.stderr
new file mode 100644
index 000000000..c39882519
--- /dev/null
+++ b/tests/ui/offset-of/offset-of-unstable.stderr
@@ -0,0 +1,84 @@
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:14:9
+ |
+LL | Unstable,
+ | ^^^^^^^^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:23:9
+ |
+LL | UnstableWithStableFieldType,
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:28:9
+ |
+LL | UnstableWithStableFieldType,
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:12:5
+ |
+LL | / offset_of!(
+LL | |
+LL | | Unstable,
+LL | | unstable
+LL | | );
+ | |_____^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:18:5
+ |
+LL | offset_of!(StableWithUnstableField, unstable);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:20:5
+ |
+LL | offset_of!(StableWithUnstableFieldType, stable.unstable);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:21:5
+ |
+LL | / offset_of!(
+LL | |
+LL | | UnstableWithStableFieldType,
+LL | | unstable
+LL | | );
+ | |_____^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0658]: use of unstable library feature 'unstable_test_feature'
+ --> $DIR/offset-of-unstable.rs:26:5
+ |
+LL | / offset_of!(
+LL | |
+LL | | UnstableWithStableFieldType,
+LL | | unstable.stable
+LL | | );
+ | |_____^
+ |
+ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable
+ = note: this error originates in the macro `offset_of` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0658`.