From 92caa91a0d2d14b920a8204f0eb44c5d3bae7309 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 15 Mar 2012 17:22:38 -0400 Subject: [PATCH] re PR c++/52582 (g++ ICE when compiling qt-4.8.0 with -O2 on PPC (32bit)) PR c++/52582 * method.c (implicitly_declare_fn): Set DECL_EXTERNAL. From-SVN: r185443 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/method.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/torture/pr52582.C | 23 +++++++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/g++.dg/torture/pr52582.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f4f46fec4a0..cf4d453597f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-03-15 Jason Merrill + + PR c++/52582 + * method.c (implicitly_declare_fn): Set DECL_EXTERNAL. + 2012-03-15 Manuel López-Ibáñez PR c++/44783 diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 07189168d1f..0d4793eb23b 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1593,6 +1593,7 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p) DECL_DELETED_FN (fn) = deleted_p; DECL_DECLARED_CONSTEXPR_P (fn) = constexpr_p; } + DECL_EXTERNAL (fn) = true; DECL_NOT_REALLY_EXTERN (fn) = 1; DECL_DECLARED_INLINE_P (fn) = 1; gcc_assert (!TREE_USED (fn)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f54a307a398..10c87e10200 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-03-15 Jason Merrill + + * g++.dg/torture/pr52582.C: New. + 2012-03-15 Bernhard Reutner-Fischer * lib/fortran-modules.exp: New file which was forgotten in r185430. diff --git a/gcc/testsuite/g++.dg/torture/pr52582.C b/gcc/testsuite/g++.dg/torture/pr52582.C new file mode 100644 index 00000000000..1b93fc490bd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr52582.C @@ -0,0 +1,23 @@ +// PR c++/52582 + +inline void *operator new (__SIZE_TYPE__, void *p) throw () +{ + return p; +} +struct B +{ + virtual ~B (); + B (); +}; +struct A : B +{ + A () : B () {} + virtual void bar (); +}; +void +foo () +{ + char a[64]; + B *b = new (&a) A (); + b->~B (); +} -- 2.30.2