aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2009-10-26 18:31:22 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2009-10-26 19:31:22 +0100
commitf96d6fd02e10a4f266c5c459461562887cbf0c6a (patch)
treeafc7e486341b3f574b937b99d93a2e7ccc1a97c8 /gcc
parent65a324b459e60405cebe9e34ee6b3496559cd217 (diff)
downloadgcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.zip
gcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.tar.gz
gcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.tar.bz2
re PR c++/41785 ([C++0x] ICE on canonical types with variadic templates and CRTP)
Fix PR c++/41785 gcc/cp/ChangeLog: PR c++/41785 * pt.c (template_args_equal): Handle comparison of an ARGUMENT_PACK_SELECT node with the arguments node it selects into. * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION. gcc/testsuite/ChangeLog: PR c++/41785 * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test. From-SVN: r153564
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.def2
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic96.C26
5 files changed, 51 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 467f078..2f7ec52 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2009-10-26 Dodji Seketeli <dodji@redhat.com>
+ PR c++/41785
+ * pt.c (template_args_equal): Handle comparison of
+ an ARGUMENT_PACK_SELECT node with the arguments node it selects into.
+ * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION.
+
+2009-10-26 Dodji Seketeli <dodji@redhat.com>
+
PR c++/41020
* decl.c (decls_match): Use DECL_IS_BUILTIN instead of
DECL_BUILT_IN.
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 4df01a8..28ecc5b 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -393,7 +393,7 @@ DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1)
};
The derivation from tuple contains a TYPE_PACK_EXPANSION for the
- template arguments. Its EXPR_PACK_EXPANSION is "Values&" and its
+ template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its
PACK_EXPANSION_PARAMETER_PACKS will contain "Values". */
DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 084ad1c..e80bc30 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5818,6 +5818,18 @@ template_args_equal (tree ot, tree nt)
return 0;
return 1;
}
+ else if (ot && TREE_CODE (ot) == ARGUMENT_PACK_SELECT)
+ {
+ /* We get here probably because we are in the middle of substituting
+ into the pattern of a pack expansion. In that case the
+ ARGUMENT_PACK_SELECT temporarily replaces the pack argument we are
+ interested in. So we want to use the initial pack argument for
+ the comparison. */
+ ot = ARGUMENT_PACK_SELECT_FROM_PACK (ot);
+ if (nt && TREE_CODE (nt) == ARGUMENT_PACK_SELECT)
+ nt = ARGUMENT_PACK_SELECT_FROM_PACK (nt);
+ return template_args_equal (ot, nt);
+ }
else if (TYPE_P (nt))
return TYPE_P (ot) && same_type_p (ot, nt);
else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 08a7de5..cc89a76 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-26 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/41785
+ * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test.
+
2009-10-26 Nick Clifton <nickc@redhat.com>
* lib/target-supports.exp (check_profiling_available):
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc/testsuite/g++.dg/cpp0x/variadic96.C
new file mode 100644
index 0000000..d4709d0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic96.C
@@ -0,0 +1,26 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/41785
+// { dg-options -std=c++0x }
+
+struct a {};
+
+template < typename T, typename ENCLOSING >
+struct base;
+
+template < typename... T >
+struct derived
+ : public base< T, derived< T... > >...
+{};
+
+template < typename... T>
+struct base< a, derived< T... > >
+{
+ typedef derived< T... >
+ Derived;
+};
+
+int main()
+{
+ derived< a > instance;
+}
+