Mark const_trait_impl
as active
This commit is contained in:
parent
b1f8e27b74
commit
8841a426e5
38 changed files with 24 additions and 47 deletions
|
@ -534,7 +534,7 @@ declare_features! (
|
||||||
(active, bindings_after_at, "1.41.0", Some(65490), None),
|
(active, bindings_after_at, "1.41.0", Some(65490), None),
|
||||||
|
|
||||||
/// Allows `impl const Trait for T` syntax.
|
/// Allows `impl const Trait for T` syntax.
|
||||||
(incomplete, const_trait_impl, "1.42.0", Some(67792), None),
|
(active, const_trait_impl, "1.42.0", Some(67792), None),
|
||||||
|
|
||||||
/// Allows `T: ?const Trait` syntax in bounds.
|
/// Allows `T: ?const Trait` syntax in bounds.
|
||||||
(incomplete, const_trait_bound_opt_out, "1.42.0", Some(67794), None),
|
(incomplete, const_trait_bound_opt_out, "1.42.0", Some(67794), None),
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#![feature(const_float_bits_conv)]
|
#![feature(const_float_bits_conv)]
|
||||||
#![feature(const_float_classify)]
|
#![feature(const_float_classify)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
// Don't promote
|
// Don't promote
|
||||||
const fn nop<T>(x: T) -> T { x }
|
const fn nop<T>(x: T) -> T { x }
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
// build-pass
|
// build-pass
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![stable(feature = "foo", since = "1.0.0")]
|
#![stable(feature = "foo", since = "1.0.0")]
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// FIXME: This test should fail since, within a const impl of `Foo`, the bound on `Foo::Bar` should
|
// FIXME: This test should fail since, within a const impl of `Foo`, the bound on `Foo::Bar` should
|
||||||
// require a const impl of `Add` for the associated type.
|
// require a const impl of `Add` for the associated type.
|
||||||
|
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
struct NonConstAdd(i32);
|
struct NonConstAdd(i32);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
#[default_method_body_is_const] //~ ERROR attribute should be applied
|
#[default_method_body_is_const] //~ ERROR attribute should be applied
|
||||||
trait A {
|
trait A {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: attribute should be applied to a trait method with body
|
error: attribute should be applied to a trait method with body
|
||||||
--> $DIR/attr-misuse.rs:4:1
|
--> $DIR/attr-misuse.rs:3:1
|
||||||
|
|
|
|
||||||
LL | #[default_method_body_is_const]
|
LL | #[default_method_body_is_const]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -13,7 +13,7 @@ LL | | }
|
||||||
| |_- not a trait method or missing a body
|
| |_- not a trait method or missing a body
|
||||||
|
|
||||||
error: attribute should be applied to a trait method with body
|
error: attribute should be applied to a trait method with body
|
||||||
--> $DIR/attr-misuse.rs:13:1
|
--> $DIR/attr-misuse.rs:12:1
|
||||||
|
|
|
|
||||||
LL | #[default_method_body_is_const]
|
LL | #[default_method_body_is_const]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -21,7 +21,7 @@ LL | fn main() {}
|
||||||
| ------------ not a trait method or missing a body
|
| ------------ not a trait method or missing a body
|
||||||
|
|
||||||
error: attribute should be applied to a trait method with body
|
error: attribute should be applied to a trait method with body
|
||||||
--> $DIR/attr-misuse.rs:6:5
|
--> $DIR/attr-misuse.rs:5:5
|
||||||
|
|
|
|
||||||
LL | #[default_method_body_is_const]
|
LL | #[default_method_body_is_const]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
pub trait MyTrait {
|
pub trait MyTrait {
|
||||||
fn func(self);
|
fn func(self);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
pub trait Plus {
|
pub trait Plus {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/call-const-trait-method-fail.rs:25:5
|
--> $DIR/call-const-trait-method-fail.rs:24:5
|
||||||
|
|
|
|
||||||
LL | a.plus(b)
|
LL | a.plus(b)
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
struct Int(i32);
|
struct Int(i32);
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![feature(const_fn_trait_bound)]
|
#![feature(const_fn_trait_bound)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
// ignore-test
|
// ignore-test
|
||||||
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![feature(const_fn_trait_bound)]
|
#![feature(const_fn_trait_bound)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
pub struct Int(i32);
|
pub struct Int(i32);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `i32`
|
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `i32`
|
||||||
--> $DIR/const-and-non-const-impl.rs:6:1
|
--> $DIR/const-and-non-const-impl.rs:5:1
|
||||||
|
|
|
|
||||||
LL | impl const std::ops::Add for i32 {
|
LL | impl const std::ops::Add for i32 {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -8,7 +8,7 @@ LL | impl const std::ops::Add for i32 {
|
||||||
- impl Add for i32;
|
- impl Add for i32;
|
||||||
|
|
||||||
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `Int`
|
error[E0119]: conflicting implementations of trait `std::ops::Add` for type `Int`
|
||||||
--> $DIR/const-and-non-const-impl.rs:24:1
|
--> $DIR/const-and-non-const-impl.rs:23:1
|
||||||
|
|
|
|
||||||
LL | impl std::ops::Add for Int {
|
LL | impl std::ops::Add for Int {
|
||||||
| -------------------------- first implementation here
|
| -------------------------- first implementation here
|
||||||
|
@ -17,7 +17,7 @@ LL | impl const std::ops::Add for Int {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Int`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Int`
|
||||||
|
|
||||||
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
||||||
--> $DIR/const-and-non-const-impl.rs:6:1
|
--> $DIR/const-and-non-const-impl.rs:5:1
|
||||||
|
|
|
|
||||||
LL | impl const std::ops::Add for i32 {
|
LL | impl const std::ops::Add for i32 {
|
||||||
| ^^^^^^^^^^^-------------^^^^^---
|
| ^^^^^^^^^^^-------------^^^^^---
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/const-check-fns-in-const-impl.rs:12:16
|
--> $DIR/const-check-fns-in-const-impl.rs:11:16
|
||||||
|
|
|
|
||||||
LL | fn foo() { non_const() }
|
LL | fn foo() { non_const() }
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![feature(const_fn_trait_bound)] // FIXME is this needed?
|
#![feature(const_fn_trait_bound)] // FIXME is this needed?
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
trait ConstDefaultFn: Sized {
|
trait ConstDefaultFn: Sized {
|
||||||
fn b(self);
|
fn b(self);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/const-default-method-bodies.rs:26:5
|
--> $DIR/const-default-method-bodies.rs:25:5
|
||||||
|
|
|
|
||||||
LL | NonConstImpl.a();
|
LL | NonConstImpl.a();
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: expected identifier, found keyword `impl`
|
error: expected identifier, found keyword `impl`
|
||||||
--> $DIR/const-impl-norecover.rs:6:7
|
--> $DIR/const-impl-norecover.rs:5:7
|
||||||
|
|
|
|
||||||
LL | const impl Foo {
|
LL | const impl Foo {
|
||||||
| ^^^^ expected identifier, found keyword
|
| ^^^^ expected identifier, found keyword
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
trait Foo {}
|
trait Foo {}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: expected identifier, found keyword `impl`
|
error: expected identifier, found keyword `impl`
|
||||||
--> $DIR/const-impl-recovery.rs:6:7
|
--> $DIR/const-impl-recovery.rs:5:7
|
||||||
|
|
|
|
||||||
LL | const impl Foo for i32 {}
|
LL | const impl Foo for i32 {}
|
||||||
| ^^^^ expected identifier, found keyword
|
| ^^^^ expected identifier, found keyword
|
||||||
|
@ -10,7 +10,7 @@ LL | impl const Foo for i32 {}
|
||||||
|-- ^^^^^
|
|-- ^^^^^
|
||||||
|
|
||||||
error: expected identifier, found keyword `impl`
|
error: expected identifier, found keyword `impl`
|
||||||
--> $DIR/const-impl-recovery.rs:10:7
|
--> $DIR/const-impl-recovery.rs:9:7
|
||||||
|
|
|
|
||||||
LL | const impl<T: Foo> Bar for T {}
|
LL | const impl<T: Foo> Bar for T {}
|
||||||
| ^^^^ expected identifier, found keyword
|
| ^^^^ expected identifier, found keyword
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/cross-crate.rs:16:5
|
--> $DIR/cross-crate.rs:15:5
|
||||||
|
|
|
|
||||||
LL | NonConst.func();
|
LL | NonConst.func();
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
// revisions: stock gated
|
// revisions: stock gated
|
||||||
#![cfg_attr(gated, feature(const_trait_impl))]
|
#![cfg_attr(gated, feature(const_trait_impl))]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
// aux-build: cross-crate.rs
|
// aux-build: cross-crate.rs
|
||||||
extern crate cross_crate;
|
extern crate cross_crate;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/cross-crate.rs:16:5
|
--> $DIR/cross-crate.rs:15:5
|
||||||
|
|
|
|
||||||
LL | NonConst.func();
|
LL | NonConst.func();
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/cross-crate.rs:18:5
|
--> $DIR/cross-crate.rs:17:5
|
||||||
|
|
|
|
||||||
LL | Const.func();
|
LL | Const.func();
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: fatal error triggered by #[rustc_error]
|
error: fatal error triggered by #[rustc_error]
|
||||||
--> $DIR/feature-gate.rs:14:1
|
--> $DIR/feature-gate.rs:13:1
|
||||||
|
|
|
|
||||||
LL | fn main() {}
|
LL | fn main() {}
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
// gate-test-const_trait_impl
|
// gate-test-const_trait_impl
|
||||||
|
|
||||||
#![cfg_attr(gated, feature(const_trait_impl))]
|
#![cfg_attr(gated, feature(const_trait_impl))]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
struct S;
|
struct S;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0658]: const trait impls are experimental
|
error[E0658]: const trait impls are experimental
|
||||||
--> $DIR/feature-gate.rs:10:6
|
--> $DIR/feature-gate.rs:9:6
|
||||||
|
|
|
|
||||||
LL | impl const T for S {}
|
LL | impl const T for S {}
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![feature(const_fn_trait_bound)]
|
#![feature(const_fn_trait_bound)]
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
// Regression test for #69615.
|
// Regression test for #69615.
|
||||||
|
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
pub trait MyTrait {
|
pub trait MyTrait {
|
||||||
fn method(&self) -> Option<()>;
|
fn method(&self) -> Option<()>;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0744]: `?` is not allowed in a `const fn`
|
error[E0744]: `?` is not allowed in a `const fn`
|
||||||
--> $DIR/hir-const-check.rs:12:9
|
--> $DIR/hir-const-check.rs:11:9
|
||||||
|
|
|
|
||||||
LL | Some(())?;
|
LL | Some(())?;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
trait Tr {
|
trait Tr {
|
||||||
fn req(&self);
|
fn req(&self);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: const trait implementations may not use non-const default functions
|
error: const trait implementations may not use non-const default functions
|
||||||
--> $DIR/impl-with-default-fn.rs:18:1
|
--> $DIR/impl-with-default-fn.rs:17:1
|
||||||
|
|
|
|
||||||
LL | / impl const Tr for S {
|
LL | / impl const Tr for S {
|
||||||
LL | | fn req(&self) {}
|
LL | | fn req(&self) {}
|
||||||
|
@ -9,7 +9,7 @@ LL | | }
|
||||||
= note: `prov` not implemented
|
= note: `prov` not implemented
|
||||||
|
|
||||||
error: const trait implementations may not use non-const default functions
|
error: const trait implementations may not use non-const default functions
|
||||||
--> $DIR/impl-with-default-fn.rs:33:1
|
--> $DIR/impl-with-default-fn.rs:32:1
|
||||||
|
|
|
|
||||||
LL | / impl const Tr for u32 {
|
LL | / impl const Tr for u32 {
|
||||||
LL | | fn req(&self) {}
|
LL | | fn req(&self) {}
|
||||||
|
@ -20,7 +20,7 @@ LL | | }
|
||||||
= note: `prov` not implemented
|
= note: `prov` not implemented
|
||||||
|
|
||||||
error[E0046]: not all trait items implemented, missing: `req`
|
error[E0046]: not all trait items implemented, missing: `req`
|
||||||
--> $DIR/impl-with-default-fn.rs:27:1
|
--> $DIR/impl-with-default-fn.rs:26:1
|
||||||
|
|
|
|
||||||
LL | fn req(&self);
|
LL | fn req(&self);
|
||||||
| -------------- `req` from trait
|
| -------------- `req` from trait
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#![allow(incomplete_features)]
|
|
||||||
#![feature(allow_internal_unstable)]
|
#![feature(allow_internal_unstable)]
|
||||||
#![feature(const_add)]
|
#![feature(const_add)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: trait methods cannot be stable const fn
|
error: trait methods cannot be stable const fn
|
||||||
--> $DIR/stability.rs:14:5
|
--> $DIR/stability.rs:13:5
|
||||||
|
|
|
|
||||||
LL | / fn sub(self, rhs: Self) -> Self {
|
LL | / fn sub(self, rhs: Self) -> Self {
|
||||||
LL | |
|
LL | |
|
||||||
|
@ -8,7 +8,7 @@ LL | | }
|
||||||
| |_____^
|
| |_____^
|
||||||
|
|
||||||
error: `<Int as Add>::add` is not yet stable as a const fn
|
error: `<Int as Add>::add` is not yet stable as a const fn
|
||||||
--> $DIR/stability.rs:32:5
|
--> $DIR/stability.rs:31:5
|
||||||
|
|
|
|
||||||
LL | Int(1i32) + Int(2i32)
|
LL | Int(1i32) + Int(2i32)
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#![feature(const_trait_bound_opt_out)]
|
#![feature(const_trait_bound_opt_out)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
#![allow(incomplete_features)]
|
|
||||||
|
|
||||||
// For now, this parses since an error does not occur until AST lowering.
|
// For now, this parses since an error does not occur until AST lowering.
|
||||||
impl ?const T {}
|
impl ?const T {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue