From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19568 invoked by alias); 16 Jan 2013 05:34:50 -0000 Received: (qmail 19376 invoked by uid 22791); 16 Jan 2013 05:34:49 -0000 X-SWARE-Spam-Status: No, hits=-4.6 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-pa0-f53.google.com (HELO mail-pa0-f53.google.com) (209.85.220.53) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 16 Jan 2013 05:34:01 +0000 Received: by mail-pa0-f53.google.com with SMTP id hz1so575231pad.12 for ; Tue, 15 Jan 2013 21:34:00 -0800 (PST) X-Received: by 10.68.227.97 with SMTP id rz1mr270961707pbc.54.1358314440528; Tue, 15 Jan 2013 21:34:00 -0800 (PST) Received: from [192.168.0.102] ([101.98.150.122]) by mx.google.com with ESMTPS id us7sm11595775pbc.40.2013.01.15.21.33.56 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 15 Jan 2013 21:33:59 -0800 (PST) From: Maxim Kuvyrkov Mime-Version: 1.0 (Apple Message framework v1283) Content-Type: multipart/mixed; boundary="Apple-Mail=_32AA50DA-90F4-4B8B-AC4C-1A6C7520BBD0" Date: Wed, 16 Jan 2013 05:34:00 -0000 Subject: [google gcc-4_7] Inlining and devirtualization tests Cc: GCC Patches To: Xinliang David Li Message-Id: X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2013-01/txt/msg00825.txt.bz2 --Apple-Mail=_32AA50DA-90F4-4B8B-AC4C-1A6C7520BBD0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Content-length: 346 David, This patch adds tests for inlining and devirtualization optimizations, some= of which are already in google's gcc-4_7 branch. It is only right to add = tests for these optimizations. Main gcc-4_7 branch and trunk pass tests 1 = and 5, while Google's gcc-4_7 branch also passes tests 2 and 3. OK to apply? Thanks, -- Maxim Kuvyrkov --Apple-Mail=_32AA50DA-90F4-4B8B-AC4C-1A6C7520BBD0 Content-Disposition: attachment; filename=0001-Inlining-and-devirtualizaion-tests.patch Content-Type: application/octet-stream; name="0001-Inlining-and-devirtualizaion-tests.patch" Content-Transfer-Encoding: quoted-printable Content-length: 17742 >From 596cf08845f5962e29ceae043849dac0469fbbee Mon Sep 17 00:00:00 2001=0A= From: Maxim Kuvyrkov =0A= Date: Wed, 16 Jan 2013 18:24:26 +1300=0A= Subject: [PATCH] Inlining and devirtualizaion tests *=0A= g++.dg/ipa/inline-devirt-{1235}.C: New tests. *=0A= g++.dg/ipa/inline-devirt-{46789}.C: New tests, xfailed for=0A= now.=0A= =0A= ---=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-1.C | 54 +++++++++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-2.C | 49 +++++++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-3.C | 49 +++++++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-4.C | 54 +++++++++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-5.C | 29 +++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-6.C | 34 ++++++++=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-7.C | 70 ++++++++++++++++= =0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-8.C | 72 ++++++++++++++++= +=0A= gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-9.C | 85 ++++++++++++++++= ++++=0A= 9 files changed, 496 insertions(+)=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-1.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-2.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-3.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-4.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-5.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-6.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-7.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-8.C=0A= create mode 100644 gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-9.C=0A= =0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-1.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-1.C=0A= new file mode 100644=0A= index 0000000..58b04d0=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-1.C=0A= @@ -0,0 +1,54 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +class Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() =3D 0;=0A= + virtual ~Calculable() {}=0A= +};=0A= +=0A= +class X : public Calculable=0A= +{=0A= +public:=0A= + unsigned char calculate() { return 1; }=0A= +};=0A= +=0A= +class Y : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() { return 2; }=0A= +};=0A= +=0A= +static void print(X& c)=0A= +{=0A= + printf("%d\n", c.calculate());=0A= + printf("+1: %d\n", c.calculate() + 1);=0A= +}=0A= +=0A= +static void print(Y& c)=0A= +{=0A= + printf("%d\n", c.calculate());=0A= + printf("+1: %d\n", c.calculate() + 1);=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + X x;=0A= + Y y;=0A= +=0A= + print(x);=0A= + print(y);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 1\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 2\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 3\\);" "optim= ized" } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-2.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-2.C=0A= new file mode 100644=0A= index 0000000..62add89=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-2.C=0A= @@ -0,0 +1,49 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +class Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() =3D 0;=0A= + virtual ~Calculable() {}=0A= +};=0A= +=0A= +class X : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() { return 1; }=0A= +};=0A= +=0A= +class Y : public Calculable=0A= +{=0A= +public:=0A= + unsigned char calculate() { return 2; }=0A= +};=0A= +=0A= +static void print(Calculable& c)=0A= +{=0A= + printf("%d\n", c.calculate());=0A= + printf("+1: %d\n", c.calculate() + 1);=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + X x;=0A= + Y y;=0A= +=0A= + print(x);=0A= + print(y);=0A= +=0A= + return 0;=0A= +=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 1\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 2\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 3\\);" "optim= ized" } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-3.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-3.C=0A= new file mode 100644=0A= index 0000000..7e62f01=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-3.C=0A= @@ -0,0 +1,49 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 3 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +class Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() const =3D 0;=0A= + virtual ~Calculable() {}=0A= +};=0A= +=0A= +class X : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() const { return 0; }=0A= +};=0A= +=0A= +class Y : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() const { return 3; }=0A= +};=0A= +=0A= +static void print(const Calculable& c)=0A= +{=0A= + for (int i =3D 0; i < c.calculate(); i++)=0A= + {=0A= + printf("%d\n", c.calculate());=0A= + }=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + X x;=0A= + Y y;=0A= +=0A= + print(x);=0A= + print(y);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 3\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 3\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 3\\);" "optimized" = } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-4.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-4.C=0A= new file mode 100644=0A= index 0000000..f5857d2=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-4.C=0A= @@ -0,0 +1,54 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 2 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +#include =0A= +=0A= +class String=0A= +{=0A= +public:=0A= + virtual uint64_t length() const =3D 0;=0A= + virtual char get(uint64_t index) const =3D 0;=0A= + virtual void set(uint64_t index, char value) =3D 0;=0A= + virtual char& operator[] (uint64_t value) =3D 0;=0A= + virtual ~String() {};=0A= +};=0A= +=0A= +template class FixedString : public String=0A= +{=0A= +private:=0A= + char contents[size + 1];=0A= +=0A= +public:=0A= + virtual uint64_t length() const { return size; }=0A= + virtual char get(uint64_t index) const { return contents[index]; }=0A= + virtual void set(uint64_t index, char value) { contents[index] =3D value= ; }=0A= + virtual char& operator[] (uint64_t index) { return contents[index]; }=0A= +=0A= + FixedString() { contents[size] =3D '\0'; }=0A= +};=0A= +=0A= +void print_length (const String& string)=0A= +{=0A= + for (uint64_t i =3D 0; i < string.length(); i++)=0A= + {=0A= + printf("%d\n", string.get(i));=0A= + }=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + FixedString<2> empty;=0A= + empty[0] =3D 'a';=0A= + empty[1] =3D 'b';=0A= +=0A= + print_length(empty);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 97\\);" "optimized"= { xfail *-*-* } } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 98\\);" "optimized"= { xfail *-*-* } } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-5.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-5.C=0A= new file mode 100644=0A= index 0000000..8acfff1=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-5.C=0A= @@ -0,0 +1,29 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +typedef unsigned char(*Calculable)(void);=0A= +typedef Calculable(*CalculateStrategy)(void);=0A= +=0A= +unsigned char one() { return 1; }=0A= +Calculable oneStrategy() { return one; }=0A= +unsigned char two() { return 2; }=0A= +Calculable twoStrategy() { return two; }=0A= +=0A= +int main()=0A= +{=0A= + printf("%d\n", oneStrategy()());=0A= + printf("+1: %d\n", oneStrategy()() + 1);=0A= + printf("%d\n", twoStrategy()());=0A= + printf("+1: %d\n", twoStrategy()() + 1);=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 1\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 2\\);" "optimized" = } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 3\\);" "optim= ized" } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-6.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-6.C=0A= new file mode 100644=0A= index 0000000..8549012=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-6.C=0A= @@ -0,0 +1,34 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +typedef unsigned char(*Calculable)(void);=0A= +typedef Calculable(*CalculateStrategy)(void);=0A= +=0A= +unsigned char one() { return 1; }=0A= +Calculable oneStrategy() { return one; }=0A= +unsigned char two() { return 2; }=0A= +Calculable twoStrategy() { return two; }=0A= +=0A= +static void print(CalculateStrategy calculateStrategy)=0A= +{=0A= + printf("%d\n", calculateStrategy()());=0A= + printf("+1: %d\n", calculateStrategy()() + 1);=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + print(oneStrategy);=0A= + print(twoStrategy);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 1\\);" "optimized" = { xfail *-*-* } } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" { xfail *-*-* } } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"%d\\\\n\", 2\\);" "optimized" = { xfail *-*-* } } }=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 3\\);" "optim= ized" { xfail *-*-* } } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-7.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-7.C=0A= new file mode 100644=0A= index 0000000..0343ddd=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-7.C=0A= @@ -0,0 +1,70 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -std=3Dc++0x -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +class Stream=0A= +{=0A= +public:=0A= + virtual unsigned char read() =3D 0;=0A= + virtual ~Stream() {}=0A= +};=0A= +=0A= +class Connection=0A= +{=0A= +public:=0A= + virtual void open() =3D 0;=0A= + virtual void close() =3D 0;=0A= + virtual ~Connection() {}=0A= +};=0A= +=0A= +class Socket : public Stream, public Connection=0A= +{=0A= +public:=0A= + virtual unsigned char read() =3D 0;=0A= + virtual void open() =3D 0;=0A= + virtual void close() { printf("generic close\n"); }=0A= +};=0A= +=0A= +class LinuxSocket : public Socket=0A= +{=0A= +public:=0A= + virtual unsigned char read() { return 'l'; }=0A= + virtual void open() { printf("linux open\n"); }=0A= +};=0A= +=0A= +class CustomSocket : public Socket=0A= +{=0A= +public:=0A= + virtual unsigned char read() { return 0; }=0A= + virtual void open() { printf("custom open\n"); }=0A= + virtual void close() { printf("custom close\n"); }=0A= +};=0A= +=0A= +static void readToEnd(Stream* stream)=0A= +{=0A= + while (stream->read() =3D=3D 0) { printf("got it\n"); }=0A= +}=0A= +=0A= +static Socket* createSocket()=0A= +{=0A= + return new LinuxSocket();=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + auto socket =3D createSocket();=0A= + socket->open();=0A= + readToEnd(socket);=0A= + socket->close();=0A= +=0A= + delete socket;=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "__builtin_puts \\(&\"linux open\"\\\[0\\\]= \\);\n" "optimized" { xfail *-*-* } } }=0A= +// { dg-final { scan-tree-dump "__builtin_puts \\(&\"generic close\"\\\[0\= \\]\\);\n" "optimized" { xfail *-*-* } } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-8.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-8.C=0A= new file mode 100644=0A= index 0000000..dac85cd=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-8.C=0A= @@ -0,0 +1,72 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 4 printf()s in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +=0A= +template class Factory=0A= +{=0A= +public:=0A= + virtual TOutput* createFrom(TInput) =3D 0;=0A= + virtual ~Factory() {};=0A= +};=0A= +=0A= +class Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() =3D 0;=0A= + virtual ~Calculable() {};=0A= +};=0A= +=0A= +class X : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() { return 1; }=0A= +};=0A= +=0A= +class Y : public Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() { throw; }=0A= +};=0A= +=0A= +enum Letter=0A= +{=0A= + LetterX,=0A= + LetterY=0A= +};=0A= +=0A= +class CalculableFactory : Factory=0A= +{=0A= +public:=0A= + virtual Calculable* createFrom(Letter letter)=0A= + {=0A= + switch(letter)=0A= + {=0A= + case LetterX: return new X();=0A= + default: return new Y();=0A= + }=0A= + }=0A= +};=0A= +=0A= +=0A= +static void print(Calculable* c)=0A= +{=0A= + printf("+1: %d\n", c->calculate() + 1);=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + CalculableFactory calcuableFactory;=0A= + Calculable* calculable =3D calcuableFactory.createFrom(LetterX);=0A= +=0A= + print(calculable);=0A= +=0A= + delete calculable;=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" { xfail *-*-* } } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= diff --git a/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-9.C b/gcc-4_7/g= cc/testsuite/g++.dg/ipa/inline-devirt-9.C=0A= new file mode 100644=0A= index 0000000..8334389=0A= --- /dev/null=0A= +++ b/gcc-4_7/gcc/testsuite/g++.dg/ipa/inline-devirt-9.C=0A= @@ -0,0 +1,85 @@=0A= +/* Verify that the inliner makes good decisions and the example=0A= + is optimized to 1 printf() in main(). */=0A= +// { dg-do compile }=0A= +// { dg-options "-O2 -std=3Dc++0x -fdump-tree-optimized" }=0A= +=0A= +#include =0A= +#include =0A= +=0A= +using namespace std;=0A= +=0A= +template class Factory=0A= +{=0A= +public:=0A= + virtual shared_ptr createFrom(TInput) =3D 0;=0A= + virtual ~Factory() {};=0A= +};=0A= +=0A= +class Calculable=0A= +{=0A= +public:=0A= + virtual unsigned char calculate() =3D 0;=0A= + virtual ~Calculable() {};=0A= +};=0A= +=0A= +enum LetterType=0A= +{=0A= + LetterX,=0A= + LetterY=0A= +};=0A= +=0A= +class Letter=0A= +{=0A= +public:=0A= + Letter(LetterType type) : _type(type) {}=0A= + virtual ~Letter() {}=0A= +=0A= +protected:=0A= + LetterType _type;=0A= +};=0A= +=0A= +class X : public Letter, public Calculable=0A= +{=0A= +public:=0A= + X() : Letter(LetterX) {}=0A= + virtual unsigned char calculate() { return 1; }=0A= +};=0A= +=0A= +class Y : public Letter, public Calculable=0A= +{=0A= +public:=0A= + Y() : Letter(LetterY) {}=0A= + virtual unsigned char calculate() { throw; }=0A= +};=0A= +=0A= +class CalculableFactory : Factory=0A= +{=0A= +public:=0A= + virtual shared_ptr createFrom(LetterType letter)=0A= + {=0A= + switch(letter)=0A= + {=0A= + case LetterX: return make_shared();=0A= + default: return make_shared();=0A= + }=0A= + }=0A= +};=0A= +=0A= +=0A= +static void print(Calculable& c)=0A= +{=0A= + printf("+1: %d\n", c.calculate() + 1);=0A= +}=0A= +=0A= +int main()=0A= +{=0A= + CalculableFactory calcuableFactory;=0A= + auto calculable =3D calcuableFactory.createFrom(LetterX);=0A= +=0A= + print(*calculable);=0A= +=0A= + return 0;=0A= +}=0A= +=0A= +// { dg-final { scan-tree-dump "printf \\(\"\\+1: %d\\\\n\", 2\\);" "optim= ized" { xfail *-*-* } } }=0A= +// { dg-final { cleanup-tree-dump "optimized" } }=0A= --=20=0A= 1.7.9.5=0A= =0A= --Apple-Mail=_32AA50DA-90F4-4B8B-AC4C-1A6C7520BBD0--