re PR lto/87089 (tree check: expected class 'type', have 'declaration' (namespace_decl) in type_with_linkage_p, at ipa-utils.h)

PR lto/87809
	PR lto/89335
	* tree.c (free_lang_data_in_decl): Do not free context of C++
	destrutors.

	* g++.dg/lto/pr87089_0.C: New testcase.
	* g++.dg/lto/pr87089_1.C: New testcase.
	* g++.dg/lto/pr89335_0.C: New testcase.

From-SVN: r269799
This commit is contained in:
Jan Hubicka 2019-03-19 15:53:43 +01:00 committed by Jan Hubicka
parent 9195aa172b
commit 2ca6d1813e
6 changed files with 72 additions and 2 deletions

View file

@ -1,3 +1,10 @@
2019-03-19 Jan Hubicka <hubicka@ucw.cz>
PR lto/87809
PR lto/89335
* tree.c (free_lang_data_in_decl): Do not free context of C++
destrutors.
2019-03-19 Jakub Jelinek <jakub@redhat.com>
PR target/89506

View file

@ -1,3 +1,11 @@
2019-03-19 Jan Hubicka <hubicka@ucw.cz>
PR lto/87809
PR lto/89335
* g++.dg/lto/pr87089_0.C: New testcase.
* g++.dg/lto/pr87089_1.C: New testcase.
* g++.dg/lto/pr89335_0.C: New testcase.
2019-03-19 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/89736

View file

@ -0,0 +1,21 @@
// { dg-lto-do link }
// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
namespace itpp {
template <class a> void b(a *c) { c[0].~a(); }
class CFix;
template <class> class d {
void e(const char *);
CFix *data;
};
class CFix {
public:
virtual ~CFix();
};
template <> void d<int>::e(const char *) { b(data); }
} // namespace itpp
int
main (void)
{
return 0;
}

View file

@ -0,0 +1,12 @@
namespace itpp {
enum a { b };
class CFix {
public:
virtual ~CFix();
};
template <a = b> class c : CFix {
~c() {}
};
template class c<>;
} // namespace itpp

View file

@ -0,0 +1,16 @@
// { dg-lto-do link }
// { dg-lto-options {{-O2 -flto -Wsuggest-final-methods}} }
// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
class Container
{
public:
virtual ~Container ();
};
class List : public Container // { dg-lto-message "final would enable devirtualization" }
{
};
static List cache[256];
int main (void)
{
return 0;
}

View file

@ -5772,10 +5772,16 @@ free_lang_data_in_decl (tree decl, struct free_lang_data_d *fld)
not do well with TREE_CHAIN pointers linking them.
Also do not drop containing types for virtual methods and tables because
these are needed by devirtualization. */
these are needed by devirtualization.
C++ destructors are special because C++ frontends sometimes produces
virtual destructor as an alias of non-virtual destructor. In
devirutalization code we always walk through aliases and we need
context to be preserved too. See PR89335 */
if (TREE_CODE (decl) != FIELD_DECL
&& ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
|| !DECL_VIRTUAL_P (decl)))
|| (!DECL_VIRTUAL_P (decl)
&& (TREE_CODE (decl) != FUNCTION_DECL
|| !DECL_CXX_DESTRUCTOR_P (decl)))))
DECL_CONTEXT (decl) = fld_decl_context (DECL_CONTEXT (decl));
}