diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-05-03 22:44:22 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-05-03 22:44:22 +0000 |
commit | 32314c3804c219efb2ba6d89a49de7d114bc3e5a (patch) | |
tree | a0710417fdd3249c6cd6f73b207187fe794b244e /gcc | |
parent | 579f4e64df26e7fe5b57cdf1f18d07eb39797265 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 2 | ||||
-rw-r--r-- | gcc/cp/pt.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/deleted4.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/deleted5.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/deleted6.C | 9 |
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>(); |