From: Mark Mitchell Date: Tue, 27 Sep 2005 23:31:57 +0000 (+0000) Subject: re PR c++/22147 (ICE in get_bindings) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c43e95f8f5f67265f05633813f3950624bb4064b;p=gcc.git re PR c++/22147 (ICE in get_bindings) PR c++/22147 * name-lookup.c (maybe_process_template_type_declaration): Don't treat forward declarations of classes as templates just because we're processing_template_decl. * pt.c (tsubst_decl): Clear DECL_TEMPLATE_INFO for friend functions. PR c++/22147 * g++.dg/template/friend37.C: New test. * g++.dg/parse/crash28.C: Adjust error markers. From-SVN: r104713 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bdc7237e4bf..0c429cff6d0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2005-09-27 Mark Mitchell + + PR c++/22147 + * name-lookup.c (maybe_process_template_type_declaration): Don't + treat forward declarations of classes as templates just because + we're processing_template_decl. + * pt.c (tsubst_decl): Clear DECL_TEMPLATE_INFO for friend + functions. + 2005-09-26 Jason Merrill PR c++/13764 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index f25a3342d70..29e5f2b2be6 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4689,6 +4689,11 @@ maybe_process_template_type_declaration (tree type, int is_friend, is a forward-declaration of `A'. */ ; + else if (b->kind == sk_namespace + && current_binding_level->kind != sk_namespace) + /* If this new type is being injected into a containing scope, + then it's not a template type. */ + ; else { gcc_assert (IS_AGGR_TYPE (type) || TREE_CODE (type) == ENUMERAL_TYPE); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index be2f0312bdf..1217580f75f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6510,6 +6510,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) && !uses_template_parms (argvec)) tsubst_default_arguments (r); } + else + DECL_TEMPLATE_INFO (r) = NULL_TREE; /* Copy the list of befriending classes. */ for (friends = &DECL_BEFRIENDING_CLASSES (r); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e6375b5576b..74cb23fe2fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-09-27 Mark Mitchell + + PR c++/22147 + * g++.dg/template/friend37.C: New test. + * g++.dg/parse/crash28.C: Adjust error markers. + 2005-09-27 Jakub Jelinek PR fortran/18518 diff --git a/gcc/testsuite/g++.dg/parse/crash28.C b/gcc/testsuite/g++.dg/parse/crash28.C index 9c38f89ba42..bc491655768 100644 --- a/gcc/testsuite/g++.dg/parse/crash28.C +++ b/gcc/testsuite/g++.dg/parse/crash28.C @@ -6,9 +6,9 @@ // Volker Reichelt template class insert_iterator > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } -template class insert_iterator { // { dg-error "template parameters not used|_Value" } +template class insert_iterator { // { dg-error "template" } hash_set<_Value>; // { dg-error "no type|expected" } }; template struct A > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } -struct A {}; // { dg-error "template argument required" } +struct A {}; diff --git a/gcc/testsuite/g++.dg/template/friend37.C b/gcc/testsuite/g++.dg/template/friend37.C new file mode 100644 index 00000000000..7c868290660 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend37.C @@ -0,0 +1,15 @@ +// PR c++/22147 + +template struct A; + +template void foo(A* p) { *p; } + +template struct A +{ + friend void foo(A*); +}; + +void bar() +{ + foo(0); +}