re PR c++/31078 (warning: same canonical type node for different types with const...
authorDouglas Gregor <doug.gregor@gmail.com>
Thu, 12 Apr 2007 11:47:56 +0000 (11:47 +0000)
committerDoug Gregor <dgregor@gcc.gnu.org>
Thu, 12 Apr 2007 11:47:56 +0000 (11:47 +0000)
2007-04-12  Douglas Gregor  <doug.gregor@gmail.com>

PR c++/31078
PR c++/31103
* c-common.c (c_build_qualified_type): Set canonical type
appropriately.

2007-04-12  Douglas Gregor  <doug.gregor@gmail.com>

PR c++/31078
* g++.dg/other/pr31078.C: New.

From-SVN: r123740

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

index 823b5a3..7349b77 100644 (file)
@@ -1,3 +1,10 @@
+2007-04-12  Douglas Gregor  <doug.gregor@gmail.com>
+
+       PR c++/31078
+       PR c++/31103
+       * c-common.c (c_build_qualified_type): Set canonical type
+       appropriately.  
+
 2007-04-12  Richard Guenther  <rguenther@suse.de>
 
        * tree-pretty-print.c (dump_generic_node): Print ARRAY_REF
index 8f71e69..761a9b4 100644 (file)
@@ -2894,8 +2894,26 @@ c_build_qualified_type (tree type, int type_quals)
        }
       if (!t)
        {
+          tree domain = TYPE_DOMAIN (type);
+
          t = build_variant_type_copy (type);
          TREE_TYPE (t) = element_type;
+
+          if (TYPE_STRUCTURAL_EQUALITY_P (element_type)
+              || (domain && TYPE_STRUCTURAL_EQUALITY_P (domain)))
+            SET_TYPE_STRUCTURAL_EQUALITY (t);
+          else if (TYPE_CANONICAL (element_type) != element_type
+                   || (domain && TYPE_CANONICAL (domain) != domain))
+            {
+              tree unqualified_canon 
+                = build_array_type (TYPE_CANONICAL (element_type),
+                                    domain? TYPE_CANONICAL (domain) 
+                                          : NULL_TREE);
+              TYPE_CANONICAL (t) 
+                = c_build_qualified_type (unqualified_canon, type_quals);
+            }
+          else
+            TYPE_CANONICAL (t) = t;
        }
       return t;
     }
index c5cf4f6..aa7e3e2 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-12  Douglas Gregor  <doug.gregor@gmail.com>
+
+       PR c++/31078
+       * g++.dg/other/pr31078.C: New.
+
 2007-04-12  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/31169
diff --git a/gcc/testsuite/g++.dg/other/pr31078.C b/gcc/testsuite/g++.dg/other/pr31078.C
new file mode 100644 (file)
index 0000000..7f61071
--- /dev/null
@@ -0,0 +1,31 @@
+typedef int SLONG;
+typedef char SCHAR;
+typedef short SSHORT;
+typedef char TEXT;
+typedef long ISC_STATUS;
+const SLONG gds_arg_string = 2;
+const SLONG gds_sys_request = 335544373L;
+enum jrd_blk_t
+{
+    type_str, type_dcc, type_sbm, type_smb, type_blb, type_irb, type_jrn
+};
+struct blk
+{
+};
+template < class RPT, SSHORT BLOCK_TYPE = 0 > class pool_alloc_rpt:public blk
+{
+};
+class jrn:public pool_alloc_rpt < SCHAR, type_jrn >
+{
+public:ISC_STATUS * jrn_status_vector;
+  TEXT jrn_server[1];
+};
+typedef jrn *JRN;
+extern void IBERR_build_status (ISC_STATUS *, ISC_STATUS, ...);
+static void
+error (ISC_STATUS * status_vector, JRN journal, int status, TEXT * string)
+{
+  IBERR_build_status (status_vector, gds_sys_request, gds_arg_string, string,
+                     gds_arg_string, (journal) ? journal->jrn_server : "",
+                     0);
+}