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
This commit is contained in:
parent
6d3c522156
commit
8e30dcf345
4 changed files with 37 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
14
gcc/testsuite/g++.dg/ext/attrib26.C
Normal file
14
gcc/testsuite/g++.dg/ext/attrib26.C
Normal file
|
@ -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)
|
||||
{
|
||||
}
|
Loading…
Add table
Reference in a new issue