diff options
author | Jason Merrill <jason@redhat.com> | 2012-12-06 09:36:55 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-12-06 09:36:55 -0500 |
commit | 5128e01493b8f75a32b413c9ff504401a116b9ca (patch) | |
tree | 97e761a9c4c402a66ef11fbffd1bd5d2b18e85ab /gcc | |
parent | 37376165bef26d983aa60dc02be6a745d43ed168 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype47.C | 12 |
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; +} |