aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2019-03-07 17:03:34 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2019-03-07 17:03:34 +0100
commit1738b52201b1ce28c9f869646f5412b8937ccfe6 (patch)
treecdb71e52faf06fd59ef5c90c4cebf832ea238b09 /gcc/testsuite
parent606711a1671cc63713b893c4557df967a5a6ac20 (diff)
downloadgcc-1738b52201b1ce28c9f869646f5412b8937ccfe6.zip
gcc-1738b52201b1ce28c9f869646f5412b8937ccfe6.tar.gz
gcc-1738b52201b1ce28c9f869646f5412b8937ccfe6.tar.bz2
Relax cgraph_node::clone_of_p to also look through former clones
2019-03-07 Martin Jambor <mjambor@suse.cz> PR ipa/88235 * cgraph.h (cgraph_node): New inline method former_thunk_p. * cgraph.c (cgraph_node::dump): Dump a note if node is a former thunk. (clone_of_p): Treat expanded thunks like thunks, be optimistic if they have multiple callees. At the end check if declarations match as opposed to cgraph_nodes. testsuite/ * g++.dg/ipa/pr88235.C: New test. From-SVN: r269462
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr88235.C55
2 files changed, 60 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d13a7db..d0bd734 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-07 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/88235
+ * g++.dg/ipa/pr88235.C: New test.
+
2019-04-07 Richard Biener <rguenther@suse.de>
PR middle-end/89618
diff --git a/gcc/testsuite/g++.dg/ipa/pr88235.C b/gcc/testsuite/g++.dg/ipa/pr88235.C
new file mode 100644
index 0000000..29f3252
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr88235.C
@@ -0,0 +1,55 @@
+// { dg-do compile }
+// { dg-options "-O1 -fdevirtualize -finline-small-functions -fipa-cp -fipa-cp-clone --param ipa-cp-eval-threshold=125 --param max-inline-insns-single=4" }
+
+extern "C" int printf (const char *, ...);
+enum E { vf_request, vf_event } want;
+
+int errs = 0;
+
+class ivResource {
+public:
+ virtual ~ivResource () { }
+};
+
+class ivHandler : public ivResource {
+public:
+ virtual void event() { }
+};
+
+class ivGlyph : public ivResource {
+public:
+ virtual ~ivGlyph () { }
+ virtual void request () {
+ if (want!=vf_request)
+ ++errs;
+ }
+};
+
+class ItemView : public ivGlyph, public ivHandler {
+public:
+ virtual void event () {
+ if (want!=vf_event)
+ ++errs;
+ }
+} a;
+
+ivGlyph *bar() {
+ return &a;
+}
+
+ivHandler *bar2() {
+ return &a;
+}
+
+int main() {
+ want=vf_request;
+ bar()->request();
+ want=vf_event;
+ bar2()->event();
+ if (errs) {
+ printf("FAIL\n");
+ return 1;
+ }
+ printf("PASS\n");
+ return 0;
+}