Hi,
I think that in order to resolve this very old accepts-invalid, we can
simply adjust the expr to the cv-qualifiers of probe_type. I also double
checked that thing are fine for other combinations of cv-qualified
reference types as parameter and as argument.
Tested x86_64-linux.
Thanks,
Paolo.
////////////////////
/cp
2013-10-10 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/31671
* pt.c (convert_nontype_argument): Adjust TREE_TYPE (expr) to
the cv-qualifiers of TREE_TYPE (probe_type).
/testsuite
2013-10-10 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/31671
* g++.dg/template/nontype26.C: New.
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 203341)
+++ cp/pt.c (working copy)
@@ -5611,7 +5611,8 @@ convert_nontype_argument (tree type, tree expr, ts
TREE_TYPE (TREE_TYPE (addr)))))
{
expr = TREE_OPERAND (addr, 0);
- expr_type = TREE_TYPE (expr);
+ expr_type = TREE_TYPE (expr) = cp_build_qualified_type
+ (TREE_TYPE (expr), cp_type_quals (TREE_TYPE (probe_type)));
}
}
}
Index: testsuite/g++.dg/template/nontype26.C
===================================================================
--- testsuite/g++.dg/template/nontype26.C (revision 0)
+++ testsuite/g++.dg/template/nontype26.C (working copy)
@@ -0,0 +1,20 @@
+// PR c++/31671
+
+template<int& i> void doit() {
+ i = 0;
+}
+
+template<const int& i> class X {
+public:
+ void foo() {
+ doit<i>(); // { dg-error "cv-qualification|no matching" }
+ }
+};
+
+int i = 0;
+
+X<i> x;
+
+int main() {
+ x.foo();
+}