Commit ab04e34b by Nathan Sidwell Committed by Nathan Sidwell

Revert 2001-03-26 Nathan Sidwell <nathan@codesourcery.com>, DR209 is now not a defect.

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
parent 049b03f4
2002-03-11 Nathan Sidwell <nathan@codesourcery.com> 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>, Revert 2000-12-01 Nathan Sidwell <nathan@codesourcery.com>,
It is incorrect. It is incorrect.
* typeck.c (build_static_cast): Compare non-qualified types * typeck.c (build_static_cast): Compare non-qualified types
......
...@@ -4062,8 +4062,6 @@ extern int types_overlap_p PARAMS ((tree, tree)); ...@@ -4062,8 +4062,6 @@ extern int types_overlap_p PARAMS ((tree, tree));
extern tree get_vbase PARAMS ((tree, tree)); extern tree get_vbase PARAMS ((tree, tree));
extern tree get_dynamic_cast_base_type PARAMS ((tree, tree)); extern tree get_dynamic_cast_base_type PARAMS ((tree, tree));
extern void type_access_control 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 int accessible_p PARAMS ((tree, tree));
extern tree lookup_field PARAMS ((tree, tree, int, int)); extern tree lookup_field PARAMS ((tree, tree, int, int));
extern int lookup_fnfields_1 PARAMS ((tree, tree)); extern int lookup_fnfields_1 PARAMS ((tree, tree));
...@@ -4171,6 +4169,7 @@ extern tree finish_qualified_call_expr 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_unary_op_expr PARAMS ((enum tree_code, tree));
extern tree finish_id_expr PARAMS ((tree)); extern tree finish_id_expr PARAMS ((tree));
extern void save_type_access_control 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 void decl_type_access_control PARAMS ((tree));
extern int begin_function_definition PARAMS ((tree, tree)); extern int begin_function_definition PARAMS ((tree, tree));
extern tree begin_constructor_declarator PARAMS ((tree, tree)); extern tree begin_constructor_declarator PARAMS ((tree, tree));
......
...@@ -11293,9 +11293,7 @@ friend declaration requires class-key, i.e. `friend %#T'", ...@@ -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. */ /* Only try to do this stuff if we didn't already give up. */
if (type != integer_type_node) if (type != integer_type_node)
{ {
/* DR 209. The friendly class does not need to be accessible decl_type_access_control (TYPE_NAME (type));
in the scope of the class granting friendship. */
skip_type_access_control ();
/* A friendly class? */ /* A friendly class? */
if (current_class_type) if (current_class_type)
...@@ -11557,33 +11555,32 @@ friend declaration requires class-key, i.e. `friend %#T'", ...@@ -11557,33 +11555,32 @@ friend declaration requires class-key, i.e. `friend %#T'",
if (friendp) if (friendp)
{ {
/* Friends are treated specially. */ /* 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) if (ctype == current_class_type)
warning ("member functions are implicitly friends of their class"); warning ("member functions are implicitly friends of their class");
else
if (decl && DECL_NAME (decl)) {
{ tree t = NULL_TREE;
if (template_class_depth (current_class_type) == 0) if (decl && DECL_NAME (decl))
{ {
decl = check_explicit_specialization if (template_class_depth (current_class_type) == 0)
(declarator, decl, {
template_count, 2 * (funcdef_flag != 0) + 4); decl
if (decl == error_mark_node) = check_explicit_specialization
return error_mark_node; (declarator, decl,
} template_count, 2 * (funcdef_flag != 0) + 4);
if (decl == error_mark_node)
t = do_friend (ctype, declarator, decl, return error_mark_node;
last_function_parms, *attrlist, flags, quals, }
funcdef_flag);
} t = do_friend (ctype, declarator, decl,
if (t && funcdef_flag) last_function_parms, *attrlist,
return t; flags, quals, funcdef_flag);
return void_type_node; }
if (t && funcdef_flag)
return t;
return void_type_node;
}
} }
/* Structure field. It may not be a function, except for C++ */ /* Structure field. It may not be a function, except for C++ */
......
...@@ -1502,32 +1502,13 @@ decl_type_access_control (decl) ...@@ -1502,32 +1502,13 @@ decl_type_access_control (decl)
added to type_lookups after typed_declspecs saved the copy that added to type_lookups after typed_declspecs saved the copy that
ended up in current_type_lookups. */ ended up in current_type_lookups. */
type_lookups = current_type_lookups; type_lookups = current_type_lookups;
current_type_lookups = NULL_TREE;
} }
/* Record the lookups, if we're doing deferred access control. */
void void
save_type_access_control (lookups) save_type_access_control (lookups)
tree lookups; tree lookups;
{ {
if (type_lookups != error_mark_node) current_type_lookups = lookups;
{
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;
} }
/* Reset the deferred access control. */ /* Reset the deferred access control. */
...@@ -1911,8 +1892,6 @@ finish_class_definition (t, attributes, semi, pop_scope_p) ...@@ -1911,8 +1892,6 @@ finish_class_definition (t, attributes, semi, pop_scope_p)
check_for_missing_semicolon (t); check_for_missing_semicolon (t);
if (pop_scope_p) if (pop_scope_p)
pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t))); pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
if (current_function_decl)
type_lookups = error_mark_node;
if (current_scope () == current_function_decl) if (current_scope () == current_function_decl)
do_pending_defargs (); do_pending_defargs ();
......
2002-03-11 Nathan Sidwell <nathan@codesourcery.com> 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. * testsuite/g++.dg/overload/pmf1.C: New test.
2002-03-11 Kazu Hirata <kazu@hxi.com> 2002-03-11 Kazu Hirata <kazu@hxi.com>
......
...@@ -5,16 +5,14 @@ ...@@ -5,16 +5,14 @@
// Bug 853: We reported the wrong line no for a friend access violation // 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 F
{ {
class Internal; class Internal; // ERROR - is private
}; };
class C class C
{ {
friend class F::Internal; friend class F::Internal; // ERROR - in this context
public: public:
typedef enum { A, B } e; typedef enum { A, B } e;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
class foo { class foo {
public: public:
typedef int sometype; typedef int sometype;
}; };
struct die : public foo::sometype { // ERROR - invalid base type struct die : public foo::sometype { // ERROR - invalid base type
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment