]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR 68851] Do not collect thunks in collect_callers
authorMartin Jambor <mjambor@suse.cz>
Fri, 8 Jan 2016 12:34:34 +0000 (13:34 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 8 Jan 2016 12:34:34 +0000 (13:34 +0100)
2016-01-08  Martin Jambor  <mjambor@suse.cz>

PR ipa/68851
gcc/
* cgraph.c (collect_callers_of_node_1): Do not collect thunks.
(collect_callers): Change comment.

testsuite/
* g++.dg/ipa/pr68851.C: New test.

From-SVN: r232160

gcc/ChangeLog
gcc/cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr68851.C [new file with mode: 0644]

index db40b82864d0a5c40112df86c0543ca0e54ac56c..ef95ce489cedf48c043311a330342c889cb2fee6 100644 (file)
@@ -1,3 +1,12 @@
+2016-01-08  Martin Jambor  <mjambor@suse.cz>
+
+       Backport from mainline
+       2015-12-15  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/68851
+       * cgraph.c (collect_callers_of_node_1): Do not collect thunks.
+       (collect_callers): Change comment.
+
 2015-12-25  Andreas Tobler  <andreast@gcc.gnu.org>
 
        Backport from mainline
index ac9b460370b1bceaa06d74a7903dd56d3bb80b59..a12b136a7fbfbeb337db34a5312e16a9a5f8d667 100644 (file)
@@ -2527,13 +2527,14 @@ collect_callers_of_node_1 (struct cgraph_node *node, void *data)
 
   if (avail > AVAIL_OVERWRITABLE)
     for (cs = node->callers; cs != NULL; cs = cs->next_caller)
-      if (!cs->indirect_inlining_edge)
+      if (!cs->indirect_inlining_edge
+         && !cs->caller->thunk.thunk_p)
         redirect_callers->safe_push (cs);
   return false;
 }
 
 /* Collect all callers of NODE and its aliases that are known to lead to NODE
-   (i.e. are not overwritable).  */
+   (i.e. are not overwritable) and that are not thunks.  */
 
 vec<cgraph_edge_p> 
 collect_callers_of_node (struct cgraph_node *node)
index 07a2e81b1947194da85ec4d4002bc103dc45d951..d1637d7ea7e689ea1aecbc8e47f030bb5285a5de 100644 (file)
@@ -1,3 +1,11 @@
+2016-01-08  Martin Jambor  <mjambor@suse.cz>
+
+       Backport from mainline
+       2015-12-15  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/68851
+       * g++.dg/ipa/pr68851.C: New test.
+
 2015-12-22  Peter Bergner  <bergner@vnet.ibm.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/ipa/pr68851.C b/gcc/testsuite/g++.dg/ipa/pr68851.C
new file mode 100644 (file)
index 0000000..659e4cd
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-O3" }
+
+class A;
+class B {
+public:
+  operator A *() const;
+};
+class A {
+public:
+  virtual bool isFormControlElement() const {}
+};
+class C {
+  struct D {
+    B element;
+  };
+  bool checkPseudoClass(const D &, int &) const;
+};
+class F {
+  virtual bool isFormControlElement() const;
+};
+class G : A, F {
+  bool isFormControlElement() const {}
+};
+bool C::checkPseudoClass(const D &p1, int &) const {
+  A &a = *p1.element;
+  a.isFormControlElement();
+  a.isFormControlElement() || a.isFormControlElement();
+}