Implement repr(transparent)
This commit is contained in:
parent
79a521bb9a
commit
2be697bc21
21 changed files with 881 additions and 12 deletions
53
src/test/codegen/repr-transparent-aggregates-1.rs
Normal file
53
src/test/codegen/repr-transparent-aggregates-1.rs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
// ignore-arm
|
||||
// ignore-mips
|
||||
// ignore-mips64
|
||||
// ignore-powerpc
|
||||
// ignore-powerpc64
|
||||
// See repr-transparent.rs
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(repr_transparent)]
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub struct Big([u32; 16]);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct BigW(Big);
|
||||
|
||||
// CHECK: define void @test_Big(%Big* [[BIG_RET_ATTRS:.*]], %Big* [[BIG_ARG_ATTRS:.*]])
|
||||
#[no_mangle]
|
||||
pub extern fn test_Big(_: Big) -> Big { loop {} }
|
||||
|
||||
// CHECK: define void @test_BigW(%BigW* [[BIG_RET_ATTRS]], %BigW* [[BIG_ARG_ATTRS]])
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigW(_: BigW) -> BigW { loop {} }
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub union BigU {
|
||||
foo: [u32; 16],
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct BigUw(BigU);
|
||||
|
||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], %BigU* [[BIGU_ARG_ATTRS:.*]])
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigU(_: BigU) -> BigU { loop {} }
|
||||
|
||||
// CHECK: define void @test_BigUw(%BigUw* [[BIGU_RET_ATTRS]], %BigUw* [[BIGU_ARG_ATTRS]])
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigUw(_: BigUw) -> BigUw { loop {} }
|
||||
54
src/test/codegen/repr-transparent-aggregates-2.rs
Normal file
54
src/test/codegen/repr-transparent-aggregates-2.rs
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
// ignore-aarch64
|
||||
// ignore-asmjs
|
||||
// ignore-s390x
|
||||
// ignore-wasm
|
||||
// ignore-x86
|
||||
// ignore-x86_64
|
||||
// See repr-transparent.rs
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(repr_transparent)]
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub struct Big([u32; 16]);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct BigW(Big);
|
||||
|
||||
// CHECK: define void @test_Big(%Big* [[BIG_RET_ATTRS:.*]], [16 x i32]
|
||||
#[no_mangle]
|
||||
pub extern fn test_Big(_: Big) -> Big { loop {} }
|
||||
|
||||
// CHECK: define void @test_BigW(%BigW* [[BIG_RET_ATTRS]], [16 x i32]
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigW(_: BigW) -> BigW { loop {} }
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub union BigU {
|
||||
foo: [u32; 16],
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct BigUw(BigU);
|
||||
|
||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], [16 x i32]
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigU(_: BigU) -> BigU { loop {} }
|
||||
|
||||
// CHECK: define void @test_BigUw(%BigUw* [[BIGU_RET_ATTRS]], [16 x i32]
|
||||
#[no_mangle]
|
||||
pub extern fn test_BigUw(_: BigUw) -> BigUw { loop {} }
|
||||
177
src/test/codegen/repr-transparent.rs
Normal file
177
src/test/codegen/repr-transparent.rs
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(repr_transparent, repr_simd)]
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub struct Zst1;
|
||||
pub struct Zst2(());
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct F32(f32);
|
||||
|
||||
// CHECK: define float @test_F32(float %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_F32(_: F32) -> F32 { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Ptr(*mut u8);
|
||||
|
||||
// CHECK: define i8* @test_Ptr(i8* %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Ptr(_: Ptr) -> Ptr { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct WithZst(u64, Zst1);
|
||||
|
||||
// CHECK: define i64 @test_WithZst(i64 %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_WithZst(_: WithZst) -> WithZst { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct WithZeroSizedArray(*const f32, [i8; 0]);
|
||||
|
||||
// Apparently we use i32* when newtype-unwrapping f32 pointers. Whatever.
|
||||
// CHECK: define i32* @test_WithZeroSizedArray(i32* %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_WithZeroSizedArray(_: WithZeroSizedArray) -> WithZeroSizedArray { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Generic<T>(T);
|
||||
|
||||
// CHECK: define double @test_Generic(double %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Generic(_: Generic<f64>) -> Generic<f64> { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct GenericPlusZst<T>(T, Zst2);
|
||||
|
||||
#[repr(u8)]
|
||||
pub enum Bool { True, False, FileNotFound }
|
||||
|
||||
// CHECK: define{{( zeroext)?}} i8 @test_Gpz(i8{{( zeroext)?}} %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Gpz(_: GenericPlusZst<Bool>) -> GenericPlusZst<Bool> { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct LifetimePhantom<'a, T: 'a>(*const T, PhantomData<&'a T>);
|
||||
|
||||
// CHECK: define i16* @test_LifetimePhantom(i16* %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_LifetimePhantom(_: LifetimePhantom<i16>) -> LifetimePhantom<i16> { loop {} }
|
||||
|
||||
// This works despite current alignment resrictions because PhantomData is always align(1)
|
||||
#[repr(transparent)]
|
||||
pub struct UnitPhantom<T, U> { val: T, unit: PhantomData<U> }
|
||||
|
||||
pub struct Px;
|
||||
|
||||
// CHECK: define float @test_UnitPhantom(float %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_UnitPhantom(_: UnitPhantom<f32, Px>) -> UnitPhantom<f32, Px> { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct TwoZsts(Zst1, i8, Zst2);
|
||||
|
||||
// CHECK: define{{( signext)?}} i8 @test_TwoZsts(i8{{( signext)?}} %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_TwoZsts(_: TwoZsts) -> TwoZsts { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Nested1(Zst2, Generic<f64>);
|
||||
|
||||
// CHECK: define double @test_Nested1(double %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Nested1(_: Nested1) -> Nested1 { loop {} }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Nested2(Nested1, Zst1);
|
||||
|
||||
// CHECK: define double @test_Nested2(double %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Nested2(_: Nested2) -> Nested2 { loop {} }
|
||||
|
||||
#[repr(simd)]
|
||||
struct f32x4(f32, f32, f32, f32);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Vector(f32x4);
|
||||
|
||||
// CHECK: define <4 x float> @test_Vector(<4 x float> %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Vector(_: Vector) -> Vector { loop {} }
|
||||
|
||||
trait Mirror { type It: ?Sized; }
|
||||
impl<T: ?Sized> Mirror for T { type It = Self; }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct StructWithProjection(<f32 as Mirror>::It);
|
||||
|
||||
// CHECK: define float @test_Projection(float %arg0)
|
||||
#[no_mangle]
|
||||
pub extern fn test_Projection(_: StructWithProjection) -> StructWithProjection { loop {} }
|
||||
|
||||
|
||||
// The rest of this file tests newtypes around small aggregates on an ABI where small aggregates are
|
||||
// packed into one register. This is ABI-dependent, so instead we focus on one ABI and supply a
|
||||
// dummy definition for other ABIs to keep FileCheck happy.
|
||||
//
|
||||
// Bigger aggregates are tested in separate files called repr-transparent-aggregate-*.rs because
|
||||
// there, the expected LLVM IR function signatures vary so much that it's not reasonably possible to
|
||||
// cover all of them with a single CHECK line. Instead we group ABIs by the general "shape" of the
|
||||
// signature and have a separate test file for each bin.
|
||||
//
|
||||
// PS: You may be wondering why we don't just compare the return types and argument types for
|
||||
// equality with FileCheck regex captures. Well, rustc doesn't perform newtype unwrapping on
|
||||
// newtypes containing aggregates. This is OK on all ABIs we support, but because LLVM has not
|
||||
// gotten rid of pointee types yet, the IR function signature will be syntactically different (%Foo*
|
||||
// vs %FooWrapper*).
|
||||
|
||||
#[repr(C)]
|
||||
pub struct Rgb8 { r: u8, g: u8, b: u8 }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct Rgb8Wrap(Rgb8);
|
||||
|
||||
// NB: closing parenthesis is missing because sometimes the argument has a name and sometimes not
|
||||
// CHECK: define i32 @test_Rgb8Wrap(i32
|
||||
#[no_mangle]
|
||||
#[cfg(all(target_arch="x86_64", target_os="linux"))]
|
||||
pub extern fn test_Rgb8Wrap(_: Rgb8Wrap) -> Rgb8Wrap { loop {} }
|
||||
|
||||
#[cfg(not(all(target_arch="x86_64", target_os="linux")))]
|
||||
#[no_mangle]
|
||||
pub extern fn test_Rgb8Wrap(_: u32) -> u32 { loop {} }
|
||||
|
||||
// Same as with the small struct above: ABI-dependent, we only test the interesting case
|
||||
// (ABIs that pack the aggregate into a scalar) and stub it out on other ABIs
|
||||
|
||||
#[repr(C)]
|
||||
pub union FloatBits {
|
||||
float: f32,
|
||||
bits: u32,
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct SmallUnion(FloatBits);
|
||||
|
||||
// NB: closing parenthesis is missing because sometimes the argument has a name and sometimes not
|
||||
// CHECK: define i32 @test_SmallUnion(i32
|
||||
#[no_mangle]
|
||||
#[cfg(all(target_arch="x86_64", target_os="linux"))]
|
||||
pub extern fn test_SmallUnion(_: SmallUnion) -> SmallUnion { loop {} }
|
||||
|
||||
#[cfg(not(all(target_arch="x86_64", target_os="linux")))]
|
||||
#[no_mangle]
|
||||
pub extern fn test_SmallUnion(_: u32) -> u32 { loop {} }
|
||||
|
|
@ -9,10 +9,12 @@
|
|||
// except according to those terms.
|
||||
|
||||
#![deny(improper_ctypes)]
|
||||
#![feature(libc, i128_type)]
|
||||
#![feature(libc, i128_type, repr_transparent)]
|
||||
|
||||
extern crate libc;
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
trait Mirror { type It: ?Sized; }
|
||||
impl<T: ?Sized> Mirror for T { type It = Self; }
|
||||
#[repr(C)]
|
||||
|
|
@ -28,6 +30,22 @@ pub type RustFn = fn();
|
|||
pub type RustBadRet = extern fn() -> Box<u32>;
|
||||
pub type CVoidRet = ();
|
||||
pub struct Foo;
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentI128(i128);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentStr(&'static str);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentBadFn(RustBadRet);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentInt(u32);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentRef<'a>(&'a TransparentInt);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentLifetime<'a>(*const u8, PhantomData<&'a ()>);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentUnit<U>(f32, PhantomData<U>);
|
||||
#[repr(transparent)]
|
||||
pub struct TransparentCustomZst(i32, ZeroSize);
|
||||
|
||||
#[repr(C)]
|
||||
pub struct ZeroSizeWithPhantomData(::std::marker::PhantomData<i32>);
|
||||
|
|
@ -51,6 +69,9 @@ extern {
|
|||
pub fn fn_type(p: RustFn); //~ ERROR found function pointer with Rust
|
||||
pub fn fn_type2(p: fn()); //~ ERROR found function pointer with Rust
|
||||
pub fn fn_contained(p: RustBadRet); //~ ERROR: found struct without
|
||||
pub fn transparent_i128(p: TransparentI128); //~ ERROR: found Rust type `i128`
|
||||
pub fn transparent_str(p: TransparentStr); //~ ERROR: found Rust type `str`
|
||||
pub fn transparent_fn(p: TransparentBadFn); //~ ERROR: found struct without
|
||||
|
||||
pub fn good3(fptr: Option<extern fn()>);
|
||||
pub fn good4(aptr: &[u8; 4 as usize]);
|
||||
|
|
@ -62,6 +83,11 @@ extern {
|
|||
pub fn good10() -> CVoidRet;
|
||||
pub fn good11(size: isize);
|
||||
pub fn good12(size: usize);
|
||||
pub fn good13(n: TransparentInt);
|
||||
pub fn good14(p: TransparentRef);
|
||||
pub fn good15(p: TransparentLifetime);
|
||||
pub fn good16(p: TransparentUnit<ZeroSize>);
|
||||
pub fn good17(p: TransparentCustomZst);
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
|
|
|
|||
40
src/test/compile-fail/repr-transparent-other-items.rs
Normal file
40
src/test/compile-fail/repr-transparent-other-items.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(repr_transparent)]
|
||||
|
||||
// See also repr-transparent.rs
|
||||
|
||||
#[repr(transparent)] //~ ERROR unsupported representation for zero-variant enum
|
||||
enum Void {} //~| ERROR should be applied to struct
|
||||
|
||||
#[repr(transparent)] //~ ERROR should be applied to struct
|
||||
enum FieldlessEnum {
|
||||
Foo,
|
||||
Bar,
|
||||
}
|
||||
|
||||
#[repr(transparent)] //~ ERROR should be applied to struct
|
||||
enum Enum {
|
||||
Foo(String),
|
||||
Bar(u32),
|
||||
}
|
||||
|
||||
#[repr(transparent)] //~ ERROR should be applied to struct
|
||||
union Foo {
|
||||
u: u32,
|
||||
s: i32
|
||||
}
|
||||
|
||||
#[repr(transparent)] //~ ERROR should be applied to struct
|
||||
fn cant_repr_this() {}
|
||||
|
||||
#[repr(transparent)] //~ ERROR should be applied to struct
|
||||
static CANT_REPR_THIS: u32 = 0;
|
||||
28
src/test/compile-fail/repr-transparent-other-reprs.rs
Normal file
28
src/test/compile-fail/repr-transparent-other-reprs.rs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(repr_transparent, repr_align, attr_literals)]
|
||||
|
||||
// See also repr-transparent.rs
|
||||
|
||||
#[repr(transparent, C)] //~ ERROR cannot have other repr
|
||||
struct TransparentPlusC {
|
||||
ptr: *const u8
|
||||
}
|
||||
|
||||
#[repr(transparent, packed)] //~ ERROR cannot have other repr
|
||||
struct TransparentPlusPacked(*const u8);
|
||||
|
||||
#[repr(transparent, align(2))] //~ ERROR cannot have other repr
|
||||
struct TransparentPlusAlign(u8);
|
||||
|
||||
#[repr(transparent)] //~ ERROR cannot have other repr
|
||||
#[repr(C)]
|
||||
struct SeparateAttributes(*mut u8);
|
||||
51
src/test/compile-fail/repr-transparent.rs
Normal file
51
src/test/compile-fail/repr-transparent.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This file tests repr(transparent)-related errors reported during typeck. Other errors
|
||||
// that are reported earlier and therefore preempt these are tested in:
|
||||
// - repr-transparent-other-reprs.rs
|
||||
// - repr-transparent-other-items.rs
|
||||
|
||||
#![feature(repr_align, attr_literals)]
|
||||
#![feature(repr_transparent)]
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
#[repr(transparent)]
|
||||
struct NoFields; //~ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
#[repr(transparent)]
|
||||
struct ContainsOnlyZst(()); //~ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
#[repr(transparent)]
|
||||
struct ContainsOnlyZstArray([bool; 0]); //~ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
#[repr(transparent)]
|
||||
struct ContainsMultipleZst(PhantomData<*const i32>, NoFields);
|
||||
//~^ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
#[repr(transparent)]
|
||||
struct MultipleNonZst(u8, u8); //~ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
trait Mirror { type It: ?Sized; }
|
||||
impl<T: ?Sized> Mirror for T { type It = Self; }
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct StructWithProjection(f32, <f32 as Mirror>::It);
|
||||
//~^ ERROR needs exactly one non-zero-sized field
|
||||
|
||||
#[repr(transparent)]
|
||||
struct NontrivialAlignZst(u32, [u16; 0]); //~ ERROR alignment larger than 1
|
||||
|
||||
#[repr(align(32))]
|
||||
struct ZstAlign32<T>(PhantomData<T>);
|
||||
|
||||
#[repr(transparent)]
|
||||
struct GenericAlign<T>(ZstAlign32<T>, u32); //~ ERROR alignment larger than 1
|
||||
14
src/test/ui/feature-gate-repr_transparent.rs
Normal file
14
src/test/ui/feature-gate-repr_transparent.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[repr(transparent)] //~ error: the `#[repr(transparent)]` attribute is experimental
|
||||
struct Foo(u64);
|
||||
|
||||
fn main() {}
|
||||
10
src/test/ui/feature-gate-repr_transparent.stderr
Normal file
10
src/test/ui/feature-gate-repr_transparent.stderr
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
error[E0658]: the `#[repr(transparent)]` attribute is experimental (see issue #43036)
|
||||
--> $DIR/feature-gate-repr_transparent.rs:11:1
|
||||
|
|
||||
11 | #[repr(transparent)] //~ error: the `#[repr(transparent)]` attribute is experimental
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add #![feature(repr_transparent)] to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue