diff options
author | Richard Biener <rguenther@suse.de> | 2014-06-10 14:10:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-06-10 14:10:57 +0000 |
commit | cdf0ab72f4bca350201d615c335ff655d426cc69 (patch) | |
tree | fbc36a8e81a99186a057a1438ffb4e9d47919bfc /gcc/tree-ssa-alias.c | |
parent | f1ab971761afd490ca8a6c56a3aae4e8a0a3c0f9 (diff) | |
download | gcc-cdf0ab72f4bca350201d615c335ff655d426cc69.zip gcc-cdf0ab72f4bca350201d615c335ff655d426cc69.tar.gz gcc-cdf0ab72f4bca350201d615c335ff655d426cc69.tar.bz2 |
re PR middle-end/61456 (Bogus "may be used uninitialized" warning)
2014-06-10 Richard Biener <rguenther@suse.de>
PR middle-end/61456
* tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
Do not use the main variant for the type comparison.
(ncr_compar): Likewise.
(nonoverlapping_component_refs_p): Likewise.
* g++.dg/opt/pr61456.C: New testcase.
From-SVN: r211411
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index f18cb48..5cc9cb5 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -835,8 +835,8 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2) /* ??? We cannot simply use the type of operand #0 of the refs here as the Fortran compiler smuggles type punning into COMPONENT_REFs for common blocks instead of using unions like everyone else. */ - tree type1 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field1)); - tree type2 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field2)); + tree type1 = DECL_CONTEXT (field1); + tree type2 = DECL_CONTEXT (field2); /* We cannot disambiguate fields in a union or qualified union. */ if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE) @@ -866,10 +866,8 @@ ncr_compar (const void *field1_, const void *field2_) { const_tree field1 = *(const_tree *) const_cast <void *>(field1_); const_tree field2 = *(const_tree *) const_cast <void *>(field2_); - unsigned int uid1 - = TYPE_UID (TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field1))); - unsigned int uid2 - = TYPE_UID (TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field2))); + unsigned int uid1 = TYPE_UID (DECL_FIELD_CONTEXT (field1)); + unsigned int uid2 = TYPE_UID (DECL_FIELD_CONTEXT (field2)); if (uid1 < uid2) return -1; else if (uid1 > uid2) @@ -893,7 +891,7 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y) while (TREE_CODE (x) == COMPONENT_REF) { tree field = TREE_OPERAND (x, 1); - tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field)); + tree type = DECL_FIELD_CONTEXT (field); if (TREE_CODE (type) == RECORD_TYPE) fieldsx.safe_push (field); x = TREE_OPERAND (x, 0); @@ -904,7 +902,7 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y) while (TREE_CODE (y) == COMPONENT_REF) { tree field = TREE_OPERAND (y, 1); - tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field)); + tree type = DECL_FIELD_CONTEXT (field); if (TREE_CODE (type) == RECORD_TYPE) fieldsy.safe_push (TREE_OPERAND (y, 1)); y = TREE_OPERAND (y, 0); @@ -915,8 +913,8 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y) /* Most common case first. */ if (fieldsx.length () == 1 && fieldsy.length () == 1) - return ((TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldsx[0])) - == TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldsy[0]))) + return ((DECL_FIELD_CONTEXT (fieldsx[0]) + == DECL_FIELD_CONTEXT (fieldsy[0])) && fieldsx[0] != fieldsy[0] && !(DECL_BIT_FIELD (fieldsx[0]) && DECL_BIT_FIELD (fieldsy[0]))); @@ -949,8 +947,8 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y) { const_tree fieldx = fieldsx[i]; const_tree fieldy = fieldsy[j]; - tree typex = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldx)); - tree typey = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldy)); + tree typex = DECL_FIELD_CONTEXT (fieldx); + tree typey = DECL_FIELD_CONTEXT (fieldy); if (typex == typey) { /* We're left with accessing different fields of a structure, |