re PR lto/41808 (error: non-trivial conversion at assignment)

2009-10-28  Richard Guenther  <rguenther@suse.de>

	PR lto/41808
	PR lto/41839
	* tree-ssa.c (useless_type_conversion_p): Do not treat
	conversions to pointers to incomplete types as useless.
	* gimple.c (gimple_types_compatible_p): Compare struct tags,
	not typedef names.

	* gcc.dg/lto/20091027-1_0.c: New testcase.
	* gcc.dg/lto/20091027-1_1.c: Likewise.
	* g++.dg/lto/20091026-1_0.C: Likewise.
	* g++.dg/lto/20091026-1_1.C: Likewise.
	* g++.dg/lto/20091026-1_a.h: Likewise.

From-SVN: r153671
This commit is contained in:
Richard Guenther 2009-10-28 14:48:34 +00:00 committed by Richard Biener
parent a1c6569544
commit cfee9aa4c9
9 changed files with 75 additions and 6 deletions

View file

@ -1,3 +1,12 @@
2009-10-28 Richard Guenther <rguenther@suse.de>
PR lto/41808
PR lto/41839
* tree-ssa.c (useless_type_conversion_p): Do not treat
conversions to pointers to incomplete types as useless.
* gimple.c (gimple_types_compatible_p): Compare struct tags,
not typedef names.
2009-10-28 Jakub Jelinek <jakub@redhat.com>
* var-tracking.c (emit_note_insn_var_location): Don't call the second

View file

@ -3368,7 +3368,8 @@ gimple_types_compatible_p (tree t1, tree t2)
&& RECORD_OR_UNION_TYPE_P (TREE_TYPE (t1))
&& (!COMPLETE_TYPE_P (TREE_TYPE (t1))
|| !COMPLETE_TYPE_P (TREE_TYPE (t2)))
&& compare_type_names_p (TREE_TYPE (t1), TREE_TYPE (t2), true))
&& compare_type_names_p (TYPE_MAIN_VARIANT (TREE_TYPE (t1)),
TYPE_MAIN_VARIANT (TREE_TYPE (t2)), true))
{
/* Replace the pointed-to incomplete type with the
complete one. */

View file

@ -1,3 +1,13 @@
2009-10-28 Richard Guenther <rguenther@suse.de>
PR lto/41808
PR lto/41839
* gcc.dg/lto/20091027-1_0.c: New testcase.
* gcc.dg/lto/20091027-1_1.c: Likewise.
* g++.dg/lto/20091026-1_0.C: Likewise.
* g++.dg/lto/20091026-1_1.C: Likewise.
* g++.dg/lto/20091026-1_a.h: Likewise.
2009-10-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/41837

View file

@ -0,0 +1,11 @@
// { dg-lto-do link }
// { dg-extra-ld-options "-r -nostdlib" }
#include "20091026-1_a.h"
cObject *cHead::find(const char *objname) const
{
return firstchildp;
}
class cNetworkType : public cObject { };
cNetworkType *networktype;

View file

@ -0,0 +1,14 @@
#include "20091026-1_a.h"
extern cHead networks;
class cNetworkType;
inline cNetworkType *findNetwork(const char *s)
{
return (cNetworkType *)networks.find(s);
}
int run(const char *opt_network_name)
{
cNetworkType *network = findNetwork(opt_network_name);
if (!network)
throw 1;
}

View file

@ -0,0 +1,9 @@
class cObject {
public:
cObject *firstchildp;
};
class cHead : public cObject {
public:
cObject *find(const char *objname) const;
};

View file

@ -0,0 +1,11 @@
/* { dg-lto-do link } */
/* { dg-extra-ld-options "-r -nostdlib" } */
typedef struct _xmlDict xmlDict;
struct _xmlDict {
int ref_counter;
};
void xmlDictCreate(void) {
xmlDict * dict;
}

View file

@ -0,0 +1,9 @@
typedef struct _xmlDict xmlDict;
struct _xmlDoc {
struct _xmlDict *dict;
};
void xmlAddEntity(struct _xmlDoc *a) {
xmlDict * dict = a->dict;
xmlHashCreateDict(0, dict);
}

View file

@ -1201,11 +1201,6 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
record type or a pointer to an unprototyped function,
then the conversion is not necessary. */
if (VOID_TYPE_P (TREE_TYPE (outer_type))
|| (AGGREGATE_TYPE_P (TREE_TYPE (outer_type))
&& TREE_CODE (TREE_TYPE (outer_type)) != ARRAY_TYPE
&& (TREE_CODE (TREE_TYPE (outer_type))
== TREE_CODE (TREE_TYPE (inner_type)))
&& !COMPLETE_TYPE_P (TREE_TYPE (outer_type)))
|| ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
&& (TREE_CODE (TREE_TYPE (outer_type))