From c498d5d2b62a2d3e339029354de06c81601abf7e Mon Sep 17 00:00:00 2001 From: paolo Date: Thu, 13 Mar 2014 16:05:15 +0000 Subject: [PATCH] /cp 2014-03-13 Paolo Carlini PR c++/60383 * pt.c (maybe_process_partial_specialization): Check return value of check_specialization_namespace. /testsuite 2014-03-13 Paolo Carlini PR c++/60383 * g++.dg/template/crash118.C: New. * g++.dg/template/crash95.C: Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208550 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 4 +++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/template/crash118.C | 11 +++++++++++ gcc/testsuite/g++.dg/template/crash95.C | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/crash118.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e5732f2d490..d90b9881c31 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2014-03-13 Paolo Carlini + PR c++/60383 + * pt.c (maybe_process_partial_specialization): Check return value + of check_specialization_namespace. + +2014-03-13 Paolo Carlini + PR c++/60254 * semantics.c (finish_static_assert): Call cxx_constant_value only if require_potential_rvalue_constant_expression returns true. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7e287f793e8..c791d031ae1 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -850,7 +850,9 @@ maybe_process_partial_specialization (tree type) if (CLASSTYPE_IMPLICIT_INSTANTIATION (type) && !COMPLETE_TYPE_P (type)) { - check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type)); + if (!check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type)) + && !at_namespace_scope_p ()) + return error_mark_node; SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type); DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)) = input_location; if (processing_template_decl) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd7e9795a28..ba1b7e8c992 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-03-13 Paolo Carlini + + PR c++/60383 + * g++.dg/template/crash118.C: New. + * g++.dg/template/crash95.C: Adjust. + 2014-03-13 Vladimir Makarov PR rtl-optimization/57189 diff --git a/gcc/testsuite/g++.dg/template/crash118.C b/gcc/testsuite/g++.dg/template/crash118.C new file mode 100644 index 00000000000..e0de605f707 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash118.C @@ -0,0 +1,11 @@ +// PR c++/60383 + +template struct A +{ + template struct B + { + template struct B {}; // { dg-error "specialization" } + }; +}; + +A<0>::B b; diff --git a/gcc/testsuite/g++.dg/template/crash95.C b/gcc/testsuite/g++.dg/template/crash95.C index 2ad9e981666..f60e635ae66 100644 --- a/gcc/testsuite/g++.dg/template/crash95.C +++ b/gcc/testsuite/g++.dg/template/crash95.C @@ -8,4 +8,4 @@ template < typename > struct S }; }; -S < int > s(0); // { dg-error "incomplete type" } +S < int > s(0); // { dg-error "no matching" } -- 2.11.4.GIT