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:
parent
a1c6569544
commit
cfee9aa4c9
9 changed files with 75 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
11
gcc/testsuite/g++.dg/lto/20091026-1_0.C
Normal file
11
gcc/testsuite/g++.dg/lto/20091026-1_0.C
Normal 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;
|
||||
|
14
gcc/testsuite/g++.dg/lto/20091026-1_1.C
Normal file
14
gcc/testsuite/g++.dg/lto/20091026-1_1.C
Normal 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;
|
||||
}
|
||||
|
9
gcc/testsuite/g++.dg/lto/20091026-1_a.h
Normal file
9
gcc/testsuite/g++.dg/lto/20091026-1_a.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
class cObject {
|
||||
public:
|
||||
cObject *firstchildp;
|
||||
};
|
||||
class cHead : public cObject {
|
||||
public:
|
||||
cObject *find(const char *objname) const;
|
||||
};
|
||||
|
11
gcc/testsuite/gcc.dg/lto/20091027-1_0.c
Normal file
11
gcc/testsuite/gcc.dg/lto/20091027-1_0.c
Normal 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;
|
||||
}
|
||||
|
9
gcc/testsuite/gcc.dg/lto/20091027-1_1.c
Normal file
9
gcc/testsuite/gcc.dg/lto/20091027-1_1.c
Normal 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);
|
||||
}
|
||||
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Reference in a new issue