aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDouglas Gregor <doug.gregor@gmail.com>2007-08-29 12:25:01 +0000
committerDoug Gregor <dgregor@gcc.gnu.org>2007-08-29 12:25:01 +0000
commit31fa49984f6d6b2a6f90296867004265ea395e07 (patch)
tree2b91b39e4ff5198911e5114e0cd3c9f44d0e6e73 /gcc
parentd2b9afb12104e09bd382b6b5f4cbfecc11983629 (diff)
downloadgcc-31fa49984f6d6b2a6f90296867004265ea395e07.zip
gcc-31fa49984f6d6b2a6f90296867004265ea395e07.tar.gz
gcc-31fa49984f6d6b2a6f90296867004265ea395e07.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/other/canon-33194.C21
-rw-r--r--gcc/tree.c12
4 files changed, 38 insertions, 7 deletions
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 <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
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 <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.
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);
}