On Mon, Dec 11, 2017 at 8:01 AM, Andi Kleen <a...@firstfloor.org> wrote:
> From: Andi Kleen <a...@linux.intel.com>
>
> This fixes a segfault in gcc 7/8 when building turicreate.
>
> For some reason the node has no decl here, and there is a
> crash when checking for attribute flatten.

As said in the PR it looks like the order array is corrupted
(a freed entry is re-used with an inline clone).

Honza?

Richard.

> gcc/:
>
> 2017-12-10  Andi Kleen  <a...@linux.intel.com>
>
>         PR ipa/83346
>         * ipa-inline.c (ipa_inline): Check for NULL pointer.
>
> gcc/testsuite:
>
> 2017-12-10  Andi Kleen  <a...@linux.intel.com>
>
>         * g++.dg/pr83346.C: Add.
> ---
>  gcc/ipa-inline.c               |  3 ++-
>  gcc/testsuite/g++.dg/pr83346.C | 32 ++++++++++++++++++++++++++++++++
>  2 files changed, 34 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/pr83346.C
>
> diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
> index 7846e93d119..dcd8a3de1ac 100644
> --- a/gcc/ipa-inline.c
> +++ b/gcc/ipa-inline.c
> @@ -2391,7 +2391,8 @@ ipa_inline (void)
>          entry of cycles, possibly cloning that entry point and
>          try to flatten itself turning it into a self-recursive
>          function.  */
> -      if (lookup_attribute ("flatten",
> +      if (node->decl
> +        && lookup_attribute ("flatten",
>                             DECL_ATTRIBUTES (node->decl)) != NULL)
>         {
>           if (dump_file)
> diff --git a/gcc/testsuite/g++.dg/pr83346.C b/gcc/testsuite/g++.dg/pr83346.C
> new file mode 100644
> index 00000000000..2a916223dc9
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr83346.C
> @@ -0,0 +1,32 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" }  */
> +namespace {
> +template <typename, typename a> struct b { a c; };
> +}
> +typedef int d;
> +namespace {
> +namespace {
> +template <typename e, typename = e, typename = e> class ac;
> +typedef ac<char> ad;
> +template <typename, typename, typename> class ac {
> +public:
> +  ~ac();
> +};
> +}
> +typedef ad f;
> +struct g {};
> +enum ag {};
> +class ae {
> +public:
> +  ~ae();
> +  template <typename h> ae(h);
> +  union aj {
> +    b<d, f> *ak;
> +    struct {
> +      ag al;
> +    };
> +  } am;
> +  __attribute__((always_inline)) void an(aj i, ag) { delete i.ak; }
> +} ao = g();
> +__attribute__((always_inline, flatten)) ae::~ae() { an(am, am.al); }
> +}
> --
> 2.15.1
>

Reply via email to