]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/45605 (Missed devirtualization)
authorJan Hubicka <jh@suse.cz>
Fri, 10 Sep 2010 09:42:20 +0000 (11:42 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 10 Sep 2010 09:42:20 +0000 (09:42 +0000)
PR tree-optimization/45605
* cp/class.c (build_vtbl_initializer): Avoid wrong type conversion in ADDR_EXPR

From-SVN: r164148

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/covariant7.C

index f2c7faa06259d7fe316d3100a1a8818ff45d9ad8..54d0ef625ed3ab831f43cccf1b05b7689c5d9905 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-10  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/45605
+       * cp/class.c (build_vtbl_initializer): Avoid wrong type conversion in ADDR_EXPR
+
 2010-09-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/45588
index 35b6db13c1f181b1812c700aca241fe0db55d1a1..4823fa23a9cf0e77c6ab2f853d2b15f8a209c79e 100644 (file)
@@ -7797,7 +7797,7 @@ build_vtbl_initializer (tree binfo,
            {
              fn = abort_fndecl;
              if (abort_fndecl_addr == NULL)
-               abort_fndecl_addr = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
+               abort_fndecl_addr = fold_convert (vfunc_ptr_type_node, build_fold_addr_expr (fn));
              init = abort_fndecl_addr;
            }
          else
@@ -7810,7 +7810,7 @@ build_vtbl_initializer (tree binfo,
                }
              /* Take the address of the function, considering it to be of an
                 appropriate generic type.  */
-             init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
+             init = fold_convert (vfunc_ptr_type_node, build_fold_addr_expr (fn));
            }
        }
 
index 32889aacd18f3a3ff65dd5d484db4670d3b7e284..f9292f1cec4f3f7ca0bb16715da676baccb99347 100644 (file)
@@ -1,3 +1,7 @@
+2010-09-10  Jan Hubicka  <jh@suse.cz>
+
+       * g++.dg/inherit/covariant7.C: Fix pattern matching.
+
 2010-09-10  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/44972
index 4d519ed400bb6118914511e74f7ee813fc509797..4f0c7f7dd49a8eadb0e3fe9300b913b48b51ad09 100644 (file)
@@ -36,16 +36,16 @@ struct c6 : c0, c3, c4
 
 // f2 appears four times in the c6 vtables:
 // once in c1-in-c3-in-c6 - covariant, virtual base, uses c1 vcall offset and c0 vbase offset
-// { dg-final { scan-tree-dump "24    c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } }
-// { dg-final { scan-tree-dump "48    c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } }
+// { dg-final { scan-tree-dump "24    .*c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "48    .*c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } }
 // once in c3-in-c6 - non-covariant, non-virtual base, calls f2 directly
-// { dg-final { scan-tree-dump "28    c6::f2" "class" { target ilp32 } } }
-// { dg-final { scan-tree-dump "56    c6::f2" "class" { target lp64 } } }
+// { dg-final { scan-tree-dump "28    .*c6::f2" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "56    .*c6::f2" "class" { target lp64 } } }
 // once in c1-in-c3-in-c4-in-c6 - lost primary
-// { dg-final { scan-tree-dump "80    0u" "class" { target ilp32 } } }
-// { dg-final { scan-tree-dump "160   0u" "class" { target lp64 } } }
+// { dg-final { scan-tree-dump "80    .*0u" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "160   .*0u" "class" { target lp64 } } }
 // once in c3-in-c4-in-c6 - c3 vcall offset
-// { dg-final { scan-tree-dump "84    c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } }
-// { dg-final { scan-tree-dump "168   c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } }
+// { dg-final { scan-tree-dump "84    .*c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "168   .*c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } }
 
 // { dg-final { cleanup-tree-dump "class" } }