OSDN Git Service

PR c++/42364
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Dec 2009 02:11:54 +0000 (02:11 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Dec 2009 02:11:54 +0000 (02:11 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155246 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic31.C
gcc/testsuite/g++.dg/ext/attrib33.C

index bf6ecd8..fbfed9f 100644 (file)
@@ -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>
 
index 68e277e..dfd2399 100644 (file)
@@ -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;
index 29f02c0..654cb1c 100644 (file)
@@ -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.
index eacf568..db8daa8 100644 (file)
@@ -1,4 +1,4 @@
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++0x -g" }
 template<typename... T>
 void eat(T...) { }
 
index 5b98984..55bfc4c 100644 (file)
@@ -1,5 +1,6 @@
 // PR c++/35546
 // { dg-do compile }
+// { dg-options "-g" }
 
 template <int N>
 struct T