/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Oct 2013 14:18:42 +0000 (14:18 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Oct 2013 14:18:42 +0000 (14:18 +0000)
2013-10-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/31671
* pt.c (convert_nontype_argument): Set expr_type to
TREE_TYPE (probe_type).

/testsuite
2013-10-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/31671
* g++.dg/template/nontype26.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203444 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/nontype26.C [new file with mode: 0644]

index da49d12..1e0c46c 100644 (file)
@@ -1,3 +1,9 @@
+2013-10-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/31671
+       * pt.c (convert_nontype_argument): Set expr_type to
+       TREE_TYPE (probe_type).
+
 2013-10-11  Jakub Jelinek  <jakub@redhat.com>
 
        * decl.c (duplicate_decls): Error out for redeclaration of UDRs.
index 5721a68..57b3ff0 100644 (file)
@@ -5611,7 +5611,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
                   TREE_TYPE (TREE_TYPE (addr)))))
            {
              expr = TREE_OPERAND (addr, 0);
-             expr_type = TREE_TYPE (expr);
+             expr_type = TREE_TYPE (probe_type);
            }
        }
     }
index f182ad7..c27d500 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/31671
+       * g++.dg/template/nontype26.C: New.
+
 2013-10-11  Thomas Schwinge  <thomas@codesourcery.com>
 
        * c-c++-common/cpp/openmp-define-1.c: New file.
diff --git a/gcc/testsuite/g++.dg/template/nontype26.C b/gcc/testsuite/g++.dg/template/nontype26.C
new file mode 100644 (file)
index 0000000..763d987
--- /dev/null
@@ -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();
+}