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();
+}

Reply via email to