re PR c++/16260 (ICE in template function)

cp:
        PR c++/16260
        * parser.c (cp_parser_template_declaration_after_export): Disable
        access checks here ...
        (cp_parser_class_specifier): ... not here.
testsuite:
        PR c++/16260
        * g++.dg/parse/crash15.C: New.

From-SVN: r83851
This commit is contained in:
Nathan Sidwell 2004-06-29 11:10:11 +00:00 committed by Nathan Sidwell
parent 962fe3950f
commit fe88415f1b
4 changed files with 29 additions and 10 deletions

View file

@ -1,3 +1,10 @@
2004-06-29 Nathan Sidwell <nathan@codesourcery.com>
PR c++/16260
* parser.c (cp_parser_template_declaration_after_export): Disable
access checks here ...
(cp_parser_class_specifier): ... not here.
2004-06-28 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK,
@ -19,7 +26,7 @@
2004-06-28 Nathan Sidwell <nathan@codesourcery.com>
PR C++/16174
PR c++/16174
* call.c (build_temp): Declare.
(check_constructor_callable): New.
(reference_binding): Only set CHECK_COPY_CONSTRUCTOR if not for

View file

@ -12343,11 +12343,6 @@ cp_parser_class_specifier (cp_parser* parser)
pop_p = push_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (type)));
type = begin_class_definition (type);
if (processing_template_decl)
/* There are no access checks when parsing a template, as we do no
know if a specialization will be a friend. */
push_deferring_access_checks (dk_no_check);
if (type == error_mark_node)
/* If the type is erroneous, skip the entire body of the class. */
cp_parser_skip_to_closing_brace (parser);
@ -12355,9 +12350,6 @@ cp_parser_class_specifier (cp_parser* parser)
/* Parse the member-specification. */
cp_parser_member_specification_opt (parser);
if (processing_template_decl)
pop_deferring_access_checks ();
/* Look for the trailing `}'. */
cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
/* We get better error messages by noticing a common problem: a
@ -14879,10 +14871,16 @@ cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
cp_parser_template_declaration_after_export (parser, member_p);
else
{
/* There are no access checks when parsing a template, as we do not
know if a specialization will be a friend. */
push_deferring_access_checks (dk_no_check);
decl = cp_parser_single_declaration (parser,
member_p,
&friend_p);
pop_deferring_access_checks ();
/* If this is a member template declaration, let the front
end know. */
if (member_p && !friend_p && decl)

View file

@ -1,3 +1,8 @@
2004-06-29 Nathan Sidwell <nathan@codesourcery.com>
PR c++/16260
* g++.dg/parse/crash15.C: New.
2004-06-28 Andrew Pinski <apinski@apple.com>
* gcc.dg/pr14963.c: Remove the dg-warning as it is dected
@ -12,7 +17,7 @@
2004-06-28 Nathan Sidwell <nathan@codesourcery.com>
* PR C++/16174
* PR c++/16174
* g++.dg/template/ctor4.C: New.
2004-06-27 Andrew Pinski <pinskia@physics.uc.edu>

View file

@ -0,0 +1,9 @@
// { dg-do compile }
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 29 Jun 2004 <nathan@codesourcery.com>
// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
// Bug 16260. ICE
template<typename T> int foo() { return T::X::Y; }