summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-11 20:51:00 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-11 20:51:00 +0000
commit528fec5ab93ebb657f93b2013b041bbd8ac956fb (patch)
treed48b9d945e4bf5ac8d946eaa74ae410efc68f450 /gcc
parent278d27f5a00ae2b34df9a46b0cc99990d18d8c83 (diff)
downloadgcc-528fec5ab93ebb657f93b2013b041bbd8ac956fb.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50595 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/decl.c53
-rw-r--r--gcc/cp/semantics.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/friend9.C6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.robertl/eb56.C2
7 files changed, 48 insertions, 57 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 513dd00cb5b..1ad21d39d11 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a2686c1c450..cae14755017 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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));
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 9eb31bac403..d7047fcdbfe 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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++ */
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index e77e9299ec1..3ec15a9bb91 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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 ();
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 354e9616129..87c3e74a21c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
diff --git a/gcc/testsuite/g++.old-deja/g++.other/friend9.C b/gcc/testsuite/g++.old-deja/g++.other/friend9.C
index e51b0274c66..442d9899e3a 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/friend9.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/friend9.C
@@ -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;
diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb56.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb56.C
index 2249a40b24c..0b4bb7dbe39 100644
--- a/gcc/testsuite/g++.old-deja/g++.robertl/eb56.C
+++ b/gcc/testsuite/g++.old-deja/g++.robertl/eb56.C
@@ -3,7 +3,7 @@
class foo {
public:
- typedef int sometype;
+ typedef int sometype;
};
struct die : public foo::sometype { // ERROR - invalid base type