From: Alexandre Oliva Date: Mon, 26 Nov 2007 06:26:18 +0000 (+0000) Subject: re PR c/27898 (Compile failure with --combine and anonymous structures) X-Git-Tag: releases/gcc-4.3.0~1338 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ae4d3cc0b299fc3323e1db876a5e41e23987f66;p=thirdparty%2Fgcc.git re PR c/27898 (Compile failure with --combine and anonymous structures) PR c/27898 * c-typeck.c (tagged_types_tu_compatible_p): Enable exact matches between anonymous union fields. From-SVN: r130425 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7dac51909add..e500186c6c5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-11-26 Alexandre Oliva + + PR c/27898 + * c-typeck.c (tagged_types_tu_compatible_p): Enable exact + matches between anonymous union fields. + 2007-11-26 Alexandre Oliva , Jan Hubicka * tree-ssa-live.c (remove_unused_scope_block_p): Drop diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index eee57892b662..6d94cabdf99e 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1233,11 +1233,12 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2) { int result; - - if (DECL_NAME (s1) == NULL - || DECL_NAME (s1) != DECL_NAME (s2)) + if (DECL_NAME (s1) != DECL_NAME (s2)) break; result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2)); + + if (result != 1 && !DECL_NAME (s1)) + break; if (result == 0) { tu->val = 0; @@ -1264,28 +1265,31 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2) { bool ok = false; - if (DECL_NAME (s1) != NULL) - for (s2 = TYPE_FIELDS (t2); s2; s2 = TREE_CHAIN (s2)) - if (DECL_NAME (s1) == DECL_NAME (s2)) - { - int result; - result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2)); - if (result == 0) - { - tu->val = 0; - return 0; - } - if (result == 2) - needs_warning = true; + for (s2 = TYPE_FIELDS (t2); s2; s2 = TREE_CHAIN (s2)) + if (DECL_NAME (s1) == DECL_NAME (s2)) + { + int result; - if (TREE_CODE (s1) == FIELD_DECL - && simple_cst_equal (DECL_FIELD_BIT_OFFSET (s1), - DECL_FIELD_BIT_OFFSET (s2)) != 1) - break; + result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2)); + + if (result != 1 && !DECL_NAME (s1)) + continue; + if (result == 0) + { + tu->val = 0; + return 0; + } + if (result == 2) + needs_warning = true; - ok = true; + if (TREE_CODE (s1) == FIELD_DECL + && simple_cst_equal (DECL_FIELD_BIT_OFFSET (s1), + DECL_FIELD_BIT_OFFSET (s2)) != 1) break; - } + + ok = true; + break; + } if (!ok) { tu->val = 0;