[pushed] c++: prvalue of array type [PR111286]
Checks
Commit Message
Tested x86_64-pc-linux-gnu, applying to trunk.
-- 8< --
Here we want to build a prvalue array to bind to the T reference, but we
were wrongly trying to strip cv-quals from the array prvalue, which should
be treated the same as a class prvalue.
PR c++/111286
gcc/cp/ChangeLog:
* tree.cc (rvalue): Don't drop cv-quals from an array.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/initlist-array22.C: New test.
---
gcc/cp/tree.cc | 9 +++++----
gcc/testsuite/g++.dg/cpp0x/initlist-array22.C | 12 ++++++++++++
2 files changed, 17 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-array22.C
base-commit: f1412546ac8999b7f6eeeee8cf967ce3f31794c2
@@ -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
new file mode 100644
@@ -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{};
+}