aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-12-06 09:36:55 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-12-06 09:36:55 -0500
commit5128e01493b8f75a32b413c9ff504401a116b9ca (patch)
tree97e761a9c4c402a66ef11fbffd1bd5d2b18e85ab /gcc
parent37376165bef26d983aa60dc02be6a745d43ed168 (diff)
downloadgcc-5128e01493b8f75a32b413c9ff504401a116b9ca.zip
gcc-5128e01493b8f75a32b413c9ff504401a116b9ca.tar.gz
gcc-5128e01493b8f75a32b413c9ff504401a116b9ca.tar.bz2
re PR c++/55564 (internal error using decltype of a template type parameter for late-specified function result type)
PR c++/55564 * pt.c (unify) [ARRAY_TYPE]: Unify the element type before the bounds. From-SVN: r194248
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype47.C12
3 files changed, 20 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 220b156..917f3e9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e349be6..27084a2 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..8e2abaa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype47.C
@@ -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;
+}