Commit 2ca6d181 by Jan Hubicka Committed by Jan Hubicka

re PR lto/87089 (tree check: expected class 'type', have 'declaration'…

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
parent 9195aa17
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> 2019-03-19 Jakub Jelinek <jakub@redhat.com>
PR target/89506 PR target/89506
......
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> 2019-03-19 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/89736 PR target/89736
......
// { 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;
}
namespace itpp {
enum a { b };
class CFix {
public:
virtual ~CFix();
};
template <a = b> class c : CFix {
~c() {}
};
template class c<>;
} // namespace itpp
// { 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;
}
...@@ -5772,10 +5772,16 @@ free_lang_data_in_decl (tree decl, struct free_lang_data_d *fld) ...@@ -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. not do well with TREE_CHAIN pointers linking them.
Also do not drop containing types for virtual methods and tables because 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 if (TREE_CODE (decl) != FIELD_DECL
&& ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_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)); DECL_CONTEXT (decl) = fld_decl_context (DECL_CONTEXT (decl));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment