re PR c++/33194 (ICE: canonical types differ for identical types void ()(const char*, ...) and void ()(const char*, ...))

2007-08-29  Douglas Gregor  <doug.gregor@gmail.com>

	PR c++/33194
	* tree.c (build_type_attribute_qual_variant): Set canonical types
	on the final, unqualified attribute variant before building the
	qualified version.

2007-08-29  Douglas Gregor  <doug.gregor@gmail.com>

	PR c++/33194
	* g++.dg/other/canon-33194.C: New.

From-SVN: r127896
This commit is contained in:
Douglas Gregor 2007-08-29 12:25:01 +00:00 committed by Doug Gregor
parent d2b9afb121
commit 31fa49984f
4 changed files with 38 additions and 7 deletions

View file

@ -1,3 +1,10 @@
2007-08-29 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33194
* tree.c (build_type_attribute_qual_variant): Set canonical types
on the final, unqualified attribute variant before building the
qualified version.
2007-08-29 Jie Zhang <jie.zhang@analog.com>
* config/bfin/bfin.c (bfin_expand_builtin): Fix the argument

View file

@ -1,3 +1,8 @@
2007-08-29 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33194
* g++.dg/other/canon-33194.C: New.
2007-08-29 Rask Ingemann Lambertsen <rask@sygehus.dk>
* gcc.c-torture/execute/simd-1.c: Use SImode vector elements.

View file

@ -0,0 +1,21 @@
// PR c++/33194
void c_translate_location (
void (*fail) (
const char *fmt, ...)
__attribute__ ((noreturn,
format (printf, 1, 2)))
);
struct dwflpp
{
static void loc2c_error (const char *fmt, ...)
{
}
void
translate_location()
{
return c_translate_location (&loc2c_error);
}
};

View file

@ -3678,12 +3678,6 @@ build_type_attribute_qual_variant (tree ttype, tree attribute, int quals)
TYPE_REFERENCE_TO (ntype) = 0;
TYPE_ATTRIBUTES (ntype) = attribute;
if (TYPE_STRUCTURAL_EQUALITY_P (ttype))
SET_TYPE_STRUCTURAL_EQUALITY (ntype);
else
TYPE_CANONICAL (ntype)
= build_qualified_type (TYPE_CANONICAL (ttype), quals);
/* Create a new main variant of TYPE. */
TYPE_MAIN_VARIANT (ntype) = ntype;
TYPE_NEXT_VARIANT (ntype) = 0;
@ -3726,8 +3720,12 @@ build_type_attribute_qual_variant (tree ttype, tree attribute, int quals)
/* If the target-dependent attributes make NTYPE different from
its canonical type, we will need to use structural equality
checks for this qualified type. */
if (!targetm.comp_type_attributes (ntype, ttype))
ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
if (TYPE_STRUCTURAL_EQUALITY_P (ttype)
|| !targetm.comp_type_attributes (ntype, ttype))
SET_TYPE_STRUCTURAL_EQUALITY (ntype);
else
TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
ttype = build_qualified_type (ntype, quals);
}