OSDN Git Service

2007-08-29 Douglas Gregor <doug.gregor@gmail.com>
authordgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Aug 2007 12:25:01 +0000 (12:25 +0000)
committerdgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Aug 2007 12:25:01 +0000 (12:25 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127896 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/canon-33194.C [new file with mode: 0644]
gcc/tree.c

index 6e32ade..5300252 100644 (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
index 213b073..eb9c329 100644 (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.
diff --git a/gcc/testsuite/g++.dg/other/canon-33194.C b/gcc/testsuite/g++.dg/other/canon-33194.C
new file mode 100644 (file)
index 0000000..496aafe
--- /dev/null
@@ -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);
+  }
+};
index 759c06a..fc5c824 100644 (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);
     }