re PR c++/55564 (internal error using decltype of a template type parameter for late...
authorJason Merrill <jason@redhat.com>
Thu, 6 Dec 2012 14:36:55 +0000 (09:36 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 Dec 2012 14:36:55 +0000 (09:36 -0500)
PR c++/55564
* pt.c (unify) [ARRAY_TYPE]: Unify the element type before the bounds.

From-SVN: r194248

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

index 220b156..917f3e9 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/55564
+       * pt.c (unify) [ARRAY_TYPE]: Unify the element type before the bounds.
+
 2012-12-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/54170
index e349be6..27084a2 100644 (file)
@@ -16593,6 +16593,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
       if ((TYPE_DOMAIN (parm) == NULL_TREE)
          != (TYPE_DOMAIN (arg) == NULL_TREE))
        return unify_type_mismatch (explain_p, parm, arg);
+      RECUR_AND_CHECK_FAILURE (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
+                              strict & UNIFY_ALLOW_MORE_CV_QUAL, explain_p);
       if (TYPE_DOMAIN (parm) != NULL_TREE)
        {
          tree parm_max;
@@ -16651,8 +16653,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
          RECUR_AND_CHECK_FAILURE (tparms, targs, parm_max, arg_max,
                                   UNIFY_ALLOW_INTEGER, explain_p);
        }
-      return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
-                   strict & UNIFY_ALLOW_MORE_CV_QUAL, explain_p);
+      return unify_success (explain_p);
 
     case REAL_TYPE:
     case COMPLEX_TYPE:
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype47.C b/gcc/testsuite/g++.dg/cpp0x/decltype47.C
new file mode 100644 (file)
index 0000000..8e2abaa
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/55564
+// { dg-options -std=c++11 }
+
+template <typename T, decltype(sizeof(T)) N>
+auto array_size(T(&)[N]) -> decltype(N) { return N; }
+
+int main() {
+  int simple[4] = {};
+  int result =  array_size(simple);
+
+  return result;
+}