Commit 8e30dcf3 by Jason Merrill Committed by Jason Merrill

re PR c++/28659 (ICE (segfault) while compiling kdelibs 4.0 snapshot)

        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
parent 6d3c5221
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
......
......@@ -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;
}
......
......@@ -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.
......
// 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)
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment