+2008-10-14 Douglas Gregor <doug.gregor@gmail.com>
+
+ PR c++/37553
+ * tree.c (build_type_attribute_qual_variant): Hash on the
+ unqualified type, and don't overwrite an existing
+ (type_hash_eq): Make the TYPE_NAME of the types significant, to
+ allow distinguishing between wchar_t and its underlying type. This
+ also means that we'll retain a little more typedef information.
+
2008-10-14 Andrey Belevantsev <abel@ispras.ru>
Dmitry Melnik <dm@ispras.ru>
Dmitry Zhurikhin <zhur@ispras.ru>
--- /dev/null
+// { dg-do compile }
+// PR c++/37553
+typedef unsigned int ui32;
+__extension__ typedef unsigned long long int ui64;
+
+typedef ui32 __attribute__ ((__may_alias__)) ui32a;
+typedef ui64 __attribute__ ((__may_alias__)) ui64a;
+
+union u_u32
+{
+ ui32a v;
+} __attribute__ ((__may_alias__));
+
+union u_u64
+{
+ ui64a v;
+ struct
+ {
+ union u_u32 lo32, hi32;
+ } u;
+} __attribute__ ((__may_alias__));
+
+void
+out_long (ui64 longVal)
+{
+ if ((*(union u_u64 *) &longVal).u.lo32.v < 0x10000000ul)
+ {
+ if ((ui32) ((*(union u_u64 *) &longVal).u.lo32.v) < 0x4000u)
+ {
+ /* do something useful */
+ }
+ }
+}
+
+void f(ui32 *) { }
+void f(ui32a *) { }
return build_qualified_type (ttype, quals);
}
+ ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
ntype = build_distinct_type_copy (ttype);
TYPE_ATTRIBUTES (ntype) = attribute;
- set_type_quals (ntype, TYPE_UNQUALIFIED);
hashcode = iterative_hash_object (code, hashcode);
if (TREE_TYPE (ntype))
/* If the target-dependent attributes make NTYPE different from
its canonical type, we will need to use structural equality
- checks for this qualified type. */
- ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
+ checks for this type. */
if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
|| !targetm.comp_type_attributes (ntype, ttype))
SET_TYPE_STRUCTURAL_EQUALITY (ntype);
- else
+ else if (TYPE_CANONICAL (ntype) == ntype)
TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
ttype = build_qualified_type (ntype, quals);
|| !attribute_list_equal (TYPE_ATTRIBUTES (a->type),
TYPE_ATTRIBUTES (b->type))
|| TYPE_ALIGN (a->type) != TYPE_ALIGN (b->type)
- || TYPE_MODE (a->type) != TYPE_MODE (b->type))
+ || TYPE_MODE (a->type) != TYPE_MODE (b->type)
+ || (TREE_CODE (a->type) != COMPLEX_TYPE
+ && TYPE_NAME (a->type) != TYPE_NAME (b->type)))
return 0;
switch (TREE_CODE (a->type))