From 31fa49984f6d6b2a6f90296867004265ea395e07 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 29 Aug 2007 12:25:01 +0000 Subject: [PATCH] re PR c++/33194 (ICE: canonical types differ for identical types void ()(const char*, ...) and void ()(const char*, ...)) 2007-08-29 Douglas Gregor 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 PR c++/33194 * g++.dg/other/canon-33194.C: New. From-SVN: r127896 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/canon-33194.C | 21 +++++++++++++++++++++ gcc/tree.c | 12 +++++------- 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/canon-33194.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e32ade..5300252 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-08-29 Douglas Gregor + + 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 * config/bfin/bfin.c (bfin_expand_builtin): Fix the argument diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 213b073..eb9c329 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-29 Douglas Gregor + + PR c++/33194 + * g++.dg/other/canon-33194.C: New. + 2007-08-29 Rask Ingemann Lambertsen * gcc.c-torture/execute/simd-1.c: Use SImode vector elements. diff --git a/gcc/testsuite/g++.dg/other/canon-33194.C b/gcc/testsuite/g++.dg/other/canon-33194.C new file mode 100644 index 0000000..496aafe --- /dev/null +++ b/gcc/testsuite/g++.dg/other/canon-33194.C @@ -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); + } +}; diff --git a/gcc/tree.c b/gcc/tree.c index 759c06a..fc5c824 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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); } -- 2.7.4