[PATCH] [PR c++/84973] don't defer output of uninstantiated templates
Alexandre Oliva
aoliva@redhat.com
Fri Mar 23 15:38:00 GMT 2018
When an anon struct gets a name through a typedef, we reset its
linkage and that of its members. Member functions may get vague
linkage, which schedules them for deferred output, but we don't want
to add them to the queue if they're uninstantiated templates,
e.g. because the enclosing function is a template. They will be added
as needed when the enclosing template is instantiated.
Regstrapped on i686- and x86_64-linux-gnu. Ok to install?
for gcc/cp/ChangeLog
PR c++/84973
* decl2.c (note_vague_linkage_fn): Don't defer uninstantiated
templates.
for gcc/testsuite/ChangeLog
PR c++/84973
* g++.dg/template/pr84973.C: New.
* g++.dg/template/pr84973-2.C: New.
* g++.dg/template/pr84973-3.C: New.
---
gcc/cp/decl2.c | 3 +++
gcc/testsuite/g++.dg/template/pr84973-2.C | 13 +++++++++++++
gcc/testsuite/g++.dg/template/pr84973-3.C | 13 +++++++++++++
gcc/testsuite/g++.dg/template/pr84973.C | 8 ++++++++
4 files changed, 37 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/template/pr84973-2.C
create mode 100644 gcc/testsuite/g++.dg/template/pr84973-3.C
create mode 100644 gcc/testsuite/g++.dg/template/pr84973.C
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e522b9ebe55a..fa753749e1a6 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -739,6 +739,9 @@ check_classfn (tree ctype, tree function, tree template_parms)
void
note_vague_linkage_fn (tree decl)
{
+ if (processing_template_decl)
+ return;
+
DECL_DEFER_OUTPUT (decl) = 1;
vec_safe_push (deferred_fns, decl);
}
diff --git a/gcc/testsuite/g++.dg/template/pr84973-2.C b/gcc/testsuite/g++.dg/template/pr84973-2.C
new file mode 100644
index 000000000000..41c205ad5243
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr84973-2.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+template <int> void a() {
+ typedef struct {
+ void b() try { b; } catch (short) { // { dg-error "invalid use" }
+ }
+ } c;
+}
+
+int
+main() {
+ a<0>();
+}
diff --git a/gcc/testsuite/g++.dg/template/pr84973-3.C b/gcc/testsuite/g++.dg/template/pr84973-3.C
new file mode 100644
index 000000000000..eeac214f2e1b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr84973-3.C
@@ -0,0 +1,13 @@
+// { dg-do link }
+
+template <int> void a() {
+ typedef struct {
+ void b() try { b(); } catch (short) {
+ }
+ } c;
+}
+
+int
+main() {
+ a<0>();
+}
diff --git a/gcc/testsuite/g++.dg/template/pr84973.C b/gcc/testsuite/g++.dg/template/pr84973.C
new file mode 100644
index 000000000000..b3f7170bc0dc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr84973.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+template <int> void a() {
+ typedef struct {
+ void b() try { b; } catch (short) {
+ }
+ } c;
+}
--
Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/ FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer
More information about the Gcc-patches
mailing list