Revert 2001-03-26 Nathan Sidwell <nathan@codesourcery.com>, DR209 is now not a defect.
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 11 Mar 2002 20:51:00 +0000 (20:51 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 11 Mar 2002 20:51:00 +0000 (20:51 +0000)
cp:
Revert 2001-03-26  Nathan Sidwell  <nathan@codesourcery.com>,
DR209 is now not a defect.
* cp-tree.h (skip_type_access_control): Remove.
* decl.c (grokdeclarator): Do type access control for friend
declarations.
* semantics.c (decl_type_access_control): Don't reset
current_type_lookups.
(save_type_access_control): Always save the lookups.
(skip_type_access_control): Remove.
(finish_class_definition): Don't change type_lookups.
testsuite:
* testsuite/g++.old-deja/g++.other/friend9.C: Revert DR 209 changes.
* testsuite/g++.old-deja/g++.robertl/eb56.C: Likewise.

From-SVN: r50595

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/friend9.C
gcc/testsuite/g++.old-deja/g++.robertl/eb56.C

index 513dd00cb5b72e565c0fea31cd5c10a289a0af3b..1ad21d39d113c7d0a87743f88c8503ce548899c5 100644 (file)
@@ -1,3 +1,16 @@
+2002-03-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       Revert 2001-03-26  Nathan Sidwell  <nathan@codesourcery.com>,
+       DR209 is now not a defect.
+       * cp-tree.h (skip_type_access_control): Remove.
+       * decl.c (grokdeclarator): Do type access control for friend
+       declarations.
+       * semantics.c (decl_type_access_control): Don't reset
+       current_type_lookups.
+       (save_type_access_control): Always save the lookups.
+       (skip_type_access_control): Remove.
+       (finish_class_definition): Don't change type_lookups.
+
 2002-03-11  Nathan Sidwell  <nathan@codesourcery.com>
 
        Revert 2000-12-01  Nathan Sidwell  <nathan@codesourcery.com>,
index a2686c1c45052502166cc5c5fd634b8ca0ecae5c..cae147550177fba369e8b698a1b984e6beb113a2 100644 (file)
@@ -4062,8 +4062,6 @@ extern int types_overlap_p                        PARAMS ((tree, tree));
 extern tree get_vbase                          PARAMS ((tree, tree));
 extern tree get_dynamic_cast_base_type          PARAMS ((tree, tree));
 extern void type_access_control                        PARAMS ((tree, tree));
-extern void skip_type_access_control            PARAMS ((void));
-extern void reset_type_access_control           PARAMS ((void));
 extern int accessible_p                         PARAMS ((tree, tree));
 extern tree lookup_field                       PARAMS ((tree, tree, int, int));
 extern int lookup_fnfields_1                    PARAMS ((tree, tree));
@@ -4171,6 +4169,7 @@ extern tree finish_qualified_call_expr          PARAMS ((tree, tree));
 extern tree finish_unary_op_expr                PARAMS ((enum tree_code, tree));
 extern tree finish_id_expr                      PARAMS ((tree));
 extern void save_type_access_control           PARAMS ((tree));
+extern void reset_type_access_control           PARAMS ((void));
 extern void decl_type_access_control           PARAMS ((tree));
 extern int begin_function_definition            PARAMS ((tree, tree));
 extern tree begin_constructor_declarator        PARAMS ((tree, tree));
index 9eb31bac4035c71d60531f846ed1f7fe49c9e7cb..d7047fcdbfebbb2b57f55114b1dfa706bac7c166 100644 (file)
@@ -11293,9 +11293,7 @@ friend declaration requires class-key, i.e. `friend %#T'",
          /* Only try to do this stuff if we didn't already give up.  */
          if (type != integer_type_node)
            {
-             /* DR 209. The friendly class does not need to be accessible
-                 in the scope of the class granting friendship. */
-             skip_type_access_control ();
+             decl_type_access_control (TYPE_NAME (type));
 
              /* A friendly class?  */
              if (current_class_type)
@@ -11557,33 +11555,32 @@ friend declaration requires class-key, i.e. `friend %#T'",
        if (friendp)
          {
            /* Friends are treated specially.  */
-            tree t = NULL_TREE;
-           
-           /* DR 209. The friend does not need to be accessible at this
-               point. */
-           skip_type_access_control ();
-           
            if (ctype == current_class_type)
              warning ("member functions are implicitly friends of their class");
-
-            if (decl && DECL_NAME (decl))
-              {
-                if (template_class_depth (current_class_type) == 0)
-                  {
-                   decl = check_explicit_specialization
-                           (declarator, decl,
-                            template_count, 2 * (funcdef_flag != 0) + 4);
-                   if (decl == error_mark_node)
-                     return error_mark_node;
-                  }
-              
-                t = do_friend (ctype, declarator, decl,
-                              last_function_parms, *attrlist, flags, quals,
-                              funcdef_flag);
-              }
-            if (t && funcdef_flag)
-              return t;
-           return void_type_node;
+           else
+             {
+               tree t = NULL_TREE;
+               if (decl && DECL_NAME (decl))
+                 {
+                   if (template_class_depth (current_class_type) == 0)
+                     {
+                       decl
+                         = check_explicit_specialization
+                         (declarator, decl,
+                          template_count, 2 * (funcdef_flag != 0) + 4);
+                       if (decl == error_mark_node)
+                         return error_mark_node;
+                     }
+                   
+                   t = do_friend (ctype, declarator, decl,
+                                  last_function_parms, *attrlist,
+                                  flags, quals, funcdef_flag);
+                 }
+               if (t && funcdef_flag)
+                 return t;
+  
+               return void_type_node;
+             }
          }
 
        /* Structure field.  It may not be a function, except for C++ */
index e77e9299ec1a4a4b8b7e9988a5d2bf239078a68b..3ec15a9bb910352ac04e209d385c0729e7614d75 100644 (file)
@@ -1502,32 +1502,13 @@ decl_type_access_control (decl)
      added to type_lookups after typed_declspecs saved the copy that
      ended up in current_type_lookups.  */
   type_lookups = current_type_lookups;
-  
-  current_type_lookups = NULL_TREE;
 }
 
-/* Record the lookups, if we're doing deferred access control.  */
-
 void
 save_type_access_control (lookups)
      tree lookups;
 {
-  if (type_lookups != error_mark_node)
-    {
-      my_friendly_assert (!current_type_lookups, 20010301);
-      current_type_lookups = lookups;
-    }
-  else
-    my_friendly_assert (!lookups || lookups == error_mark_node, 20010301);
-}
-
-/* Set things up so that the next deferred access control will succeed.
-   This is needed for friend declarations see grokdeclarator for details.  */
-
-void
-skip_type_access_control ()
-{
-  type_lookups = NULL_TREE;
+  current_type_lookups = lookups;
 }
 
 /* Reset the deferred access control.  */
@@ -1911,8 +1892,6 @@ finish_class_definition (t, attributes, semi, pop_scope_p)
     check_for_missing_semicolon (t); 
   if (pop_scope_p)
     pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
-  if (current_function_decl)
-    type_lookups = error_mark_node;
   if (current_scope () == current_function_decl)
     do_pending_defargs ();
 
index 354e9616129ce2bb311f4fa379ad2953541af79d..87c3e74a21ccbff2d93de81a4533814b2bfa6cf2 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * testsuite/g++.old-deja/g++.other/friend9.C: Revert DR 209 changes.
+       * testsuite/g++.old-deja/g++.robertl/eb56.C: Likewise.
+
 2002-03-11  Nathan Sidwell  <nathan@codesourcery.com>
 
        * testsuite/g++.dg/overload/pmf1.C: New test.
index e51b0274c6654dd33c61ba7e8417d1c7da16675a..442d9899e3a7d0d7de58636389a527b72ca80d2a 100644 (file)
@@ -5,16 +5,14 @@
 
 // Bug 853: We reported the wrong line no for a friend access violation
 
-// Since DR 209, friend declaration access is not checked.
-
 class F
 {
-  class Internal;
+  class Internal;   // ERROR - is private
 };
 
 class C
 {
-  friend class F::Internal;
+  friend class F::Internal; // ERROR - in this context
   public:
   typedef enum { A, B } e;
 
index 2249a40b24ccf218c8df529875ff3b2a93b5973e..0b4bb7dbe39932b9a6d88a68035f992577ad60b7 100644 (file)
@@ -3,7 +3,7 @@
 
 class foo {
   public:
-        typedef int sometype;
+  typedef int sometype;
 };
 
 struct die : public foo::sometype { // ERROR - invalid base type