re PR c++/28659 (ICE (segfault) while compiling kdelibs 4.0 snapshot)
authorJason Merrill <jason@redhat.com>
Tue, 22 Aug 2006 18:27:26 +0000 (14:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 22 Aug 2006 18:27:26 +0000 (14:27 -0400)
        PR c++/28659
        * typeck.c (merge_types): If either of the types have the right
        attributes, return that one.

        * tree.c (cp_build_type_attribute_variant): Make sure we aren't
        doing this to class types.
        * typeck.c (original_type): Deal with type quals properly.

From-SVN: r116329

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/ext/attrib26.C [new file with mode: 0644]

index fa7d6bc0e65b6aa6cf5e9aee4e924687ef990423..22dbdba69368fb826df4e7f0cb97b5d5d768dadf 100644 (file)
@@ -1,3 +1,13 @@
+2006-08-22  Jason Merrill  <jason@redhat.com>
+
+       PR c++/28659
+       * typeck.c (merge_types): If either of the types have the right 
+       attributes, return that one.
+
+       * tree.c (cp_build_type_attribute_variant): Make sure we aren't
+       doing this to class types.
+       * typeck.c (original_type): Deal with type quals properly.
+
 2006-08-21  Jason Merrill  <jason@redhat.com>
 
        PR c++/27115
index bb579a6f739984977bec883b78e269e39ec02485..1cedec55f8d7c92b7622221b4a9845c76b41069a 100644 (file)
@@ -1936,6 +1936,10 @@ cp_build_type_attribute_variant (tree type, tree attributes)
          != TYPE_RAISES_EXCEPTIONS (type)))
     new_type = build_exception_variant (new_type,
                                        TYPE_RAISES_EXCEPTIONS (type));
+
+  /* Making a new main variant of a class type is broken.  */
+  gcc_assert (!CLASS_TYPE_P (type) || new_type == type);
+    
   return new_type;
 }
 
index f337328cfcd883721a9f74e1c534f5515650e849..c07a78d1ef4f4bf2eb289f281d7aca3710a84ca7 100644 (file)
@@ -228,6 +228,7 @@ commonparms (tree p1, tree p2)
 static tree
 original_type (tree t)
 {
+  int quals = cp_type_quals (t);
   while (t != error_mark_node
         && TYPE_NAME (t) != NULL_TREE)
     {
@@ -239,7 +240,7 @@ original_type (tree t)
        break;
       t = x;
     }
-  return t;
+  return cp_build_qualified_type (t, quals);
 }
 
 /* T1 and T2 are arithmetic or enumeration types.  Return the type
@@ -730,7 +731,13 @@ merge_types (tree t1, tree t2)
 
     default:;
     }
-  return cp_build_type_attribute_variant (t1, attributes);
+
+  if (attribute_list_equal (TYPE_ATTRIBUTES (t1), attributes))
+    return t1;
+  else if (attribute_list_equal (TYPE_ATTRIBUTES (t2), attributes))
+    return t2;
+  else
+    return cp_build_type_attribute_variant (t1, attributes);
 }
 
 /* Return the common type of two types.
diff --git a/gcc/testsuite/g++.dg/ext/attrib26.C b/gcc/testsuite/g++.dg/ext/attrib26.C
new file mode 100644 (file)
index 0000000..dedf43a
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/28659
+// The attribute was causing us to get confused in merge_types when
+// combining the template type with an uninstantiated version.
+
+template<class T>
+struct __attribute__((aligned(1))) A
+{
+  A& operator=(const A &t);
+};
+
+template<class T>
+A<T>& A<T>::operator=(const A<T> &t)
+{
+}