Hi,
On 10/10/2013 08:26 PM, Jason Merrill wrote:
On 10/10/2013 08:33 AM, Paolo Carlini wrote:
+ expr_type = TREE_TYPE (expr) = cp_build_qualified_type
+ (TREE_TYPE (expr), cp_type_quals (TREE_TYPE (probe_type)));
Won't that end up being the same as the contents of expr_type before
this statement? Can we just remove this assignment?
Also, clobbering TREE_TYPE (expr) strikes me as a bad idea.
Sorry. Having figured out where the problem was, I messed up very badly
when I prepared the actual patch for submission. The below makes much
more sense to me.
Thanks,
Paolo.
////////////////////
/cp
2013-10-10 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/31671
* pt.c (convert_nontype_argument): Set expr_type to
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 203392)
+++ cp/pt.c (working copy)
@@ -5611,7 +5611,7 @@ 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 (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();
+}