aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-12-14 21:11:54 -0500
committerJason Merrill <jason@gcc.gnu.org>2009-12-14 21:11:54 -0500
commit0857d1f0b1161a03207d64708f083c16880a65f8 (patch)
tree40cb649be49d08265a63b4d8dbbe9f7dac3ad9e1 /gcc
parent6ba6f70d7fa8fa889576172a23c199a51abdd045 (diff)
downloadgcc-0857d1f0b1161a03207d64708f083c16880a65f8.zip
gcc-0857d1f0b1161a03207d64708f083c16880a65f8.tar.gz
gcc-0857d1f0b1161a03207d64708f083c16880a65f8.tar.bz2
re PR c++/42364 (C++ testsuite fails with -g)
PR c++/42364 * pt.c (function_parameter_expanded_from_pack_p): Don't require a pack to have a name. (tsubst_decl): Do typedef magic after applying attributes. From-SVN: r155246
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c40
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic31.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib33.C1
5 files changed, 36 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bf6ecd8..fbfed9f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/42364
+ * pt.c (function_parameter_expanded_from_pack_p): Don't require
+ a pack to have a name.
+ (tsubst_decl): Do typedef magic after applying attributes.
+
2009-12-15 Paolo Bonzini <bonzini@gnu.org>
Shujing Zhao <pearly.zhao@oracle.com>
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 68e277e..dfd2399 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -2730,15 +2730,13 @@ get_function_template_decl (const_tree primary_func_tmpl_inst)
bool
function_parameter_expanded_from_pack_p (tree param_decl, tree pack)
{
- if (DECL_ARTIFICIAL (param_decl)
- || !function_parameter_pack_p (pack))
- return false;
-
- gcc_assert (DECL_NAME (param_decl) && DECL_NAME (pack));
+ if (DECL_ARTIFICIAL (param_decl)
+ || !function_parameter_pack_p (pack))
+ return false;
- /* The parameter pack and its pack arguments have the same
- DECL_PARM_INDEX. */
- return DECL_PARM_INDEX (pack) == DECL_PARM_INDEX (param_decl);
+ /* The parameter pack and its pack arguments have the same
+ DECL_PARM_INDEX. */
+ return DECL_PARM_INDEX (pack) == DECL_PARM_INDEX (param_decl);
}
/* Determine whether ARGS describes a variadic template args list,
@@ -9273,7 +9271,13 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
/* Create a new node for the specialization we need. */
r = copy_decl (t);
if (type == NULL_TREE)
- type = tsubst (TREE_TYPE (t), args, complain, in_decl);
+ {
+ if (is_typedef_decl (t))
+ type = DECL_ORIGINAL_TYPE (t);
+ else
+ type = TREE_TYPE (t);
+ type = tsubst (type, args, complain, in_decl);
+ }
if (TREE_CODE (r) == VAR_DECL)
{
/* Even if the original location is out of scope, the
@@ -9344,16 +9348,6 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
}
determine_visibility (r);
}
- /* Preserve a typedef that names a type. */
- else if (TREE_CODE (r) == TYPE_DECL
- && DECL_ORIGINAL_TYPE (t)
- && type != error_mark_node)
- {
- DECL_ORIGINAL_TYPE (r) = tsubst (DECL_ORIGINAL_TYPE (t),
- args, complain, in_decl);
- TREE_TYPE (r) = type = build_variant_type_copy (type);
- TYPE_NAME (type) = r;
- }
if (!local_p)
{
@@ -9391,6 +9385,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
apply_late_template_attributes (&r, DECL_ATTRIBUTES (r),
(int) ATTR_FLAG_TYPE_IN_PLACE,
args, complain, in_decl);
+
+ /* Preserve a typedef that names a type. */
+ if (is_typedef_decl (r))
+ {
+ DECL_ORIGINAL_TYPE (r) = NULL_TREE;
+ set_underlying_type (r);
+ }
+
layout_decl (r, 0);
}
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 29f02c0..654cb1c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/42364
+ * g++.dg/cpp0x/variadic31.C: Compile with -g.
+ * g++.dg/ext/attrib33.C: Likewise.
+
2009-12-15 Shujing Zhao <pearly.zhao@oracle.com>
* g++.dg/other/error20.C: Adjust dg-message strings.
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic31.C b/gcc/testsuite/g++.dg/cpp0x/variadic31.C
index eacf568..db8daa8 100644
--- a/gcc/testsuite/g++.dg/cpp0x/variadic31.C
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic31.C
@@ -1,4 +1,4 @@
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++0x -g" }
template<typename... T>
void eat(T...) { }
diff --git a/gcc/testsuite/g++.dg/ext/attrib33.C b/gcc/testsuite/g++.dg/ext/attrib33.C
index 5b98984..55bfc4c 100644
--- a/gcc/testsuite/g++.dg/ext/attrib33.C
+++ b/gcc/testsuite/g++.dg/ext/attrib33.C
@@ -1,5 +1,6 @@
// PR c++/35546
// { dg-do compile }
+// { dg-options "-g" }
template <int N>
struct T