diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc
index 5c8c05dc168be25cf91d1dbb75373c8276440fd8..50dc345ec9afd8a3180d9507b35aaa7717b03c22 100644
--- a/gcc/cp/tree.cc
+++ b/gcc/cp/tree.cc
@@ -977,11 +977,12 @@ rvalue (tree expr)
 
   expr = mark_rvalue_use (expr);
 
-  /* [basic.lval]
-
-     Non-class rvalues always have cv-unqualified types.  */
+  /* [expr.type]: "If a prvalue initially has the type "cv T", where T is a
+     cv-unqualified non-class, non-array type, the type of the expression is
+     adjusted to T prior to any further analysis.  */
   type = TREE_TYPE (expr);
-  if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
+  if (!CLASS_TYPE_P (type) && TREE_CODE (type) != ARRAY_TYPE
+      && cv_qualified_p (type))
     type = cv_unqualified (type);
 
   /* We need to do this for rvalue refs as well to get the right answer
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array22.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array22.C
new file mode 100644
index 0000000000000000000000000000000000000000..8629e4be239e32c73d4104d54bd9008b6d72915c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array22.C
@@ -0,0 +1,12 @@
+// PR c++/111286
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -Wno-unused }
+
+struct A {
+  A() noexcept {}
+};
+
+void foo() {
+  using T = const A (&)[1];
+  T{};
+}