aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-05-03 22:44:22 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-05-03 22:44:22 +0000
commit32314c3804c219efb2ba6d89a49de7d114bc3e5a (patch)
treea0710417fdd3249c6cd6f73b207187fe794b244e /gcc
parent579f4e64df26e7fe5b57cdf1f18d07eb39797265 (diff)
downloadgcc-32314c3804c219efb2ba6d89a49de7d114bc3e5a.zip
gcc-32314c3804c219efb2ba6d89a49de7d114bc3e5a.tar.gz
gcc-32314c3804c219efb2ba6d89a49de7d114bc3e5a.tar.bz2
re PR c++/58582 ([c++11] ICE defining and instantiating deleted template function)
/cp 2014-05-03 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58582 * decl.c (grokfndecl): Check duplicate_decls return value for error_mark_node. * pt.c (instantiate_decl): A deleted function is defined. /testsuite 2014-05-03 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58582 * g++.dg/cpp0x/deleted4.C: New. * g++.dg/cpp0x/deleted5.C: Likewise. * g++.dg/cpp0x/deleted6.C: Likewise. From-SVN: r210043
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/pt.c22
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/deleted4.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/deleted5.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/deleted6.C9
7 files changed, 60 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d15fed1..374cd0f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2014-05-03 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/58582
+ * decl.c (grokfndecl): Check duplicate_decls return value for
+ error_mark_node.
+ * pt.c (instantiate_decl): A deleted function is defined.
+
2014-05-02 Jason Merrill <jason@redhat.com>
* decl2.c (vague_linkage_p): Local statics have vague linkage.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 202db35..ffaff5c 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7822,6 +7822,8 @@ grokfndecl (tree ctype,
decl, ctype);
return NULL_TREE;
}
+ if (ok == error_mark_node)
+ return NULL_TREE;
return old_decl;
}
}
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 1584eb9..7e7f6d8 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19620,7 +19620,8 @@ instantiate_decl (tree d, int defer_ok,
if (TREE_CODE (d) == FUNCTION_DECL)
pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE
- || DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern));
+ || DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern)
+ || DECL_DELETED_FN (code_pattern));
else
pattern_defined = ! DECL_IN_AGGR_P (code_pattern);
@@ -19862,14 +19863,17 @@ instantiate_decl (tree d, int defer_ok,
tf_warning_or_error, tmpl,
/*integral_constant_expression_p=*/false);
- /* Set the current input_location to the end of the function
- so that finish_function knows where we are. */
- input_location
- = DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus;
-
- /* Remember if we saw an infinite loop in the template. */
- current_function_infinite_loop
- = DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
+ if (DECL_STRUCT_FUNCTION (code_pattern))
+ {
+ /* Set the current input_location to the end of the function
+ so that finish_function knows where we are. */
+ input_location
+ = DECL_STRUCT_FUNCTION (code_pattern)->function_end_locus;
+
+ /* Remember if we saw an infinite loop in the template. */
+ current_function_infinite_loop
+ = DECL_STRUCT_FUNCTION (code_pattern)->language->infinite_loop;
+ }
}
/* We don't need the local specializations any more. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06e3fa4..3b613d9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-05-03 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/58582
+ * g++.dg/cpp0x/deleted4.C: New.
+ * g++.dg/cpp0x/deleted5.C: Likewise.
+ * g++.dg/cpp0x/deleted6.C: Likewise.
+
2014-05-03 Dominique d'Humieres <dominiq@lps.ens.fr>
PR fortran/61025
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted4.C b/gcc/testsuite/g++.dg/cpp0x/deleted4.C
new file mode 100644
index 0000000..22439d4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/deleted4.C
@@ -0,0 +1,11 @@
+// PR c++/58582
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<int> void foo() = delete;
+};
+
+template<int> void A::foo() { int i; } // { dg-error "redefinition" }
+
+template void A::foo<0>();
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted5.C b/gcc/testsuite/g++.dg/cpp0x/deleted5.C
new file mode 100644
index 0000000..51010ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/deleted5.C
@@ -0,0 +1,11 @@
+// PR c++/58582
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<int> void foo() = delete;
+};
+
+template<int> void A::foo() {} // { dg-error "redefinition" }
+
+template void A::foo<0>();
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted6.C b/gcc/testsuite/g++.dg/cpp0x/deleted6.C
new file mode 100644
index 0000000..af25b50
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/deleted6.C
@@ -0,0 +1,9 @@
+// PR c++/58582
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<int> void foo() = delete;
+};
+
+template void A::foo<0>();