Aliasing 'this' in a C++ constructor
authorMarc Glisse <marc.glisse@inria.fr>
Fri, 18 May 2018 22:21:20 +0000 (00:21 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Fri, 18 May 2018 22:21:20 +0000 (22:21 +0000)
2018-05-18  Marc Glisse  <marc.glisse@inria.fr>

PR c++/82899
gcc/
* tree-ssa-structalias.c (create_variable_info_for_1): Extra argument.
(intra_create_variable_infos): Handle C++ constructors.

gcc/testsuite/
* g++.dg/pr82899.C: New testcase.

From-SVN: r260383

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr82899.C [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 241e42a4a657afbbcdba0ceafe17ae8ec7d5fb8d..581f05076bc4003959e0b7b0d5959e7305c95ce0 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-18  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/82899
+       * tree-ssa-structalias.c (create_variable_info_for_1): Extra argument.
+       (intra_create_variable_infos): Handle C++ constructors.
+
 2018-05-18  Martin Liska  <mliska@suse.cz>
 
        * passes.def: Remove a redundant pass.
index 6ce3c16edf72e31a398094cec26157f0596247be..76e016990078946a7cd34c60d4851ee82d732afd 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-18  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR c++/82899
+       * g++.dg/pr82899.C: New testcase.
+
 2018-05-18  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/pr68766.c: Change pruned output.
diff --git a/gcc/testsuite/g++.dg/pr82899.C b/gcc/testsuite/g++.dg/pr82899.C
new file mode 100644 (file)
index 0000000..0dee25f
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+struct A {
+  int i;
+  A(A&);
+};
+int X;
+A::A(A&a):i(42){
+  a.i=0;
+  X=i;
+}
+
+/* { dg-final { scan-tree-dump "X = 42;" "optimized" } } */
index d3b38c3eaf2789f4269b1cd038065e8ebc7dc15f..8fb13a0cdf823615ab8c9ddc854f53ff62b2e18a 100644 (file)
@@ -5935,11 +5935,14 @@ check_for_overlaps (vec<fieldoff_s> fieldstack)
    This will also create any varinfo structures necessary for fields
    of DECL.  DECL is a function parameter if HANDLE_PARAM is set.
    HANDLED_STRUCT_TYPE is used to register struct types reached by following
-   restrict pointers.  This is needed to prevent infinite recursion.  */
+   restrict pointers.  This is needed to prevent infinite recursion.
+   If ADD_RESTRICT, pretend that the pointer NAME is restrict even if DECL
+   does not advertise it.  */
 
 static varinfo_t
 create_variable_info_for_1 (tree decl, const char *name, bool add_id,
-                           bool handle_param, bitmap handled_struct_type)
+                           bool handle_param, bitmap handled_struct_type,
+                           bool add_restrict = false)
 {
   varinfo_t vi, newvi;
   tree decl_type = TREE_TYPE (decl);
@@ -6013,7 +6016,7 @@ create_variable_info_for_1 (tree decl, const char *name, bool add_id,
       vi->size = vi->fullsize;
       vi->is_full_var = true;
       if (POINTER_TYPE_P (decl_type)
-         && TYPE_RESTRICT (decl_type))
+         && (TYPE_RESTRICT (decl_type) || add_restrict))
        vi->only_restrict_pointers = 1;
       if (vi->only_restrict_pointers
          && !type_contains_placeholder_p (TREE_TYPE (decl_type))
@@ -6242,6 +6245,7 @@ intra_create_variable_infos (struct function *fn)
 {
   tree t;
   bitmap handled_struct_type = NULL;
+  bool this_parm_in_ctor = DECL_CXX_CONSTRUCTOR_P (fn->decl);
 
   /* For each incoming pointer argument arg, create the constraint ARG
      = NONLOCAL or a dummy variable if it is a restrict qualified
@@ -6253,10 +6257,12 @@ intra_create_variable_infos (struct function *fn)
 
       varinfo_t p
        = create_variable_info_for_1 (t, alias_get_name (t), false, true,
-                                     handled_struct_type);
+                                     handled_struct_type, this_parm_in_ctor);
       insert_vi_for_tree (t, p);
 
       make_param_constraints (p);
+
+      this_parm_in_ctor = false;
     }
 
   if (handled_struct_type != NULL)