about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/borrow_check/nll/type_check/mod.rs1
-rw-r--r--src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs24
-rw-r--r--src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr10
3 files changed, 35 insertions, 0 deletions
diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs
index 823a249760f..d64643430c9 100644
--- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs
+++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs
@@ -1008,6 +1008,7 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
 
                 let ty = self.tcx().type_of(def_id);
                 let ty = ty.subst(tcx, substs);
+                let ty = self.normalize(ty, locations);
 
                 self.relate_types(ty, v1, a, locations, category)?;
 
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs
new file mode 100644
index 00000000000..4292fc710e9
--- /dev/null
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.rs
@@ -0,0 +1,24 @@
+#![feature(nll)]
+
+trait Mirror {
+    type Me;
+}
+
+impl<T> Mirror for T {
+    type Me = T;
+}
+
+trait Foo<'a> {
+    const C: <&'a u32 as Mirror>::Me;
+}
+
+impl<'a, T> Foo<'a> for T {
+    const C: &'a u32 = &22;
+}
+
+fn foo<'a>(_: &'a u32) -> &'static u32 {
+    <() as Foo<'a>>::C //~ ERROR
+}
+
+fn main() {
+}
diff --git a/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr
new file mode 100644
index 00000000000..7aeb276eeb9
--- /dev/null
+++ b/src/test/ui/nll/user-annotations/constant-in-expr-normalize.stderr
@@ -0,0 +1,10 @@
+error: unsatisfied lifetime constraints
+  --> $DIR/constant-in-expr-normalize.rs:20:5
+   |
+LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
+   |        -- lifetime `'a` defined here
+LL |     <() as Foo<'a>>::C //~ ERROR
+   |     ^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
+
+error: aborting due to previous error
+