re PR c++/31078 (warning: same canonical type node for different types with const strings)

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
This commit is contained in:
Douglas Gregor 2007-04-12 11:47:56 +00:00 committed by Doug Gregor
parent a670437d92
commit 9576481824
4 changed files with 61 additions and 0 deletions

View 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

View 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;
}

View 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

View File

@ -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);
}