re PR c++/63362 (The c++11 triviality-traits need front-end help)
authorJason Merrill <jason@redhat.com>
Fri, 3 Oct 2014 15:52:03 +0000 (11:52 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 3 Oct 2014 15:52:03 +0000 (11:52 -0400)
PR c++/63362
* tree.c (strip_typedefs): Handle TREE_LIST.

From-SVN: r215860

gcc/cp/ChangeLog
gcc/cp/tree.c

index 80ed468ab5c2ceffc3429197cadd4ecca3c951f8..4f91a68824bf1748d8c92650ff864086a74737e3 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/63362
+       * tree.c (strip_typedefs): Handle TREE_LIST.
+
 2014-10-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * parser.c (cp_parser_assignment_expression,
index 2247eb5baa8689f95fed05dccde1aeb990f53fff..316c8ff8d40cb1b784930220799ceb8a63e97b63 100644 (file)
@@ -1201,11 +1201,33 @@ strip_typedefs (tree t)
 {
   tree result = NULL, type = NULL, t0 = NULL;
 
-  if (!t || t == error_mark_node || t == TYPE_CANONICAL (t))
+  if (!t || t == error_mark_node)
     return t;
 
+  if (TREE_CODE (t) == TREE_LIST)
+    {
+      bool changed = false;
+      vec<tree,va_gc> *vec = make_tree_vector ();
+      for (; t; t = TREE_CHAIN (t))
+       {
+         gcc_assert (!TREE_PURPOSE (t));
+         tree elt = strip_typedefs (TREE_VALUE (t));
+         if (elt != TREE_VALUE (t))
+           changed = true;
+         vec_safe_push (vec, elt);
+       }
+      tree r = t;
+      if (changed)
+       r = build_tree_list_vec (vec);
+      release_tree_vector (vec);
+      return r;
+    }
+
   gcc_assert (TYPE_P (t));
 
+  if (t == TYPE_CANONICAL (t))
+    return t;
+
   switch (TREE_CODE (t))
     {
     case POINTER_TYPE: