re PR c++/16260 (ICE in template function)
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 29 Jun 2004 11:10:11 +0000 (11:10 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 29 Jun 2004 11:10:11 +0000 (11:10 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/crash15.C [new file with mode: 0644]

index ad782f26c60526277b5f6c2678d1f5ad3ab27b3f..532180d82c25cecc19cc85596790662b6ec90a5f 100644 (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
index 10238c4a2f1d91a67c60d937fb415964cf994028..ca2b0a995d2227f91615acc71088900039b4d571 100644 (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)
index bff0e80e7ce514bcac94d50a3c6272b330bed91d..3fe71ecf5dbd3d4313ff7494d0661dff1b8371ec 100644 (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>
diff --git a/gcc/testsuite/g++.dg/parse/crash15.C b/gcc/testsuite/g++.dg/parse/crash15.C
new file mode 100644 (file)
index 0000000..afad4c1
--- /dev/null
@@ -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; }