From 1c37c75b3ffa30f44064cd6c3cfefccc66d76873 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 8 Mar 2011 20:28:13 -0500 Subject: [PATCH] re PR c++/45651 (ICE in import_export_decl, at cp/decl2.c:2344) PR c++/45651 * pt.c (instantiate_decl): Don't clear DECL_INTERFACE_KNOWN on !TREE_PUBLIC decls. From-SVN: r170805 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 9 +++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/template/anon5.C | 6 ++++++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/anon5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fb0f7037a6d4..ce2384af3e2f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-03-08 Jason Merrill + + PR c++/45651 + * pt.c (instantiate_decl): Don't clear DECL_INTERFACE_KNOWN on + !TREE_PUBLIC decls. + 2011-03-08 Jason Merrill PR c++/47289 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6b3bc5a5c69e..fb60c49723ea 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15533,8 +15533,13 @@ instantiate_decl (tree d, int defer_ok, if (!pattern_defined && expl_inst_class_mem_p && DECL_EXPLICIT_INSTANTIATION (d)) { - DECL_NOT_REALLY_EXTERN (d) = 0; - DECL_INTERFACE_KNOWN (d) = 0; + /* Leave linkage flags alone on instantiations with anonymous + visibility. */ + if (TREE_PUBLIC (d)) + { + DECL_NOT_REALLY_EXTERN (d) = 0; + DECL_INTERFACE_KNOWN (d) = 0; + } SET_DECL_IMPLICIT_INSTANTIATION (d); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93ca90981454..9d6cda6ece9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-08 Jason Merrill + + * g++.dg/template/anon5.C: New. + 2011-03-08 Jason Merrill * g++.dg/cpp0x/variadic105.C: New. diff --git a/gcc/testsuite/g++.dg/template/anon5.C b/gcc/testsuite/g++.dg/template/anon5.C new file mode 100644 index 000000000000..34599c061e7c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon5.C @@ -0,0 +1,6 @@ +// PR c++/45651 + +namespace { template struct A {}; } +template struct B { void f(A); }; +template struct B<1>; +template void B::f(A) {} -- 2.47.2