OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Mar 2002 20:51:00 +0000 (20:51 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Mar 2002 20:51:00 +0000 (20:51 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50595 138bc75d-0d04-0410-961f-82ee72b054a4

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 513dd00..1ad21d3 100644 (file)
@@ -1,5 +1,18 @@
 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>,
        It is incorrect.
        * typeck.c (build_static_cast): Compare non-qualified types
index a2686c1..cae1475 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 9eb31ba..d7047fc 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 e77e929..3ec15a9 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 354e961..87c3e74 100644 (file)
@@ -1,5 +1,10 @@
 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.
 
 2002-03-11  Kazu Hirata  <kazu@hxi.com>
index e51b027..442d989 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 2249a40..0b4bb7d 100644 (file)
@@ -3,7 +3,7 @@
 
 class foo {
   public:
-        typedef int sometype;
+  typedef int sometype;
 };
 
 struct die : public foo::sometype { // ERROR - invalid base type