[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