aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr84973-2.C13
-rw-r--r--gcc/testsuite/g++.dg/template/pr84973-3.C13
-rw-r--r--gcc/testsuite/g++.dg/template/pr84973.C8
6 files changed, 46 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 23f5d3a..fc7b6b9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2018-03-28 Alexandre Oliva <aoliva@redhat.com>
+ PR c++/84973
+ * decl2.c (note_vague_linkage_fn): Don't defer uninstantiated
+ templates.
+
PR c++/84968
* tree.c (strip_typedefs_expr): Reject STATEMENT_LISTs.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e522b9e..fa75374 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/ChangeLog b/gcc/testsuite/ChangeLog
index 929d4dd..252854e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2018-03-28 Alexandre Oliva <aoliva@redhat.com>
+ PR c++/84973
+ * g++.dg/template/pr84973.C: New.
+ * g++.dg/template/pr84973-2.C: New.
+ * g++.dg/template/pr84973-3.C: New.
+
PR c++/84968
* g++.dg/eh/pr84968.C: New.
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 0000000..41c205a
--- /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 0000000..eeac214
--- /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 0000000..b3f7170
--- /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;
+}