Commit 279b8466 by Mark Mitchell Committed by Mark Mitchell

parser.c (cp_parser_primary_expression): Preserve the form of qualified expressions in templates...

	* parser.c (cp_parser_primary_expression): Preserve the form of
	qualified expressions in templates, even if they are not
	dependent.
	* pt.c (convert_nontype_argument): Handle non-dependent SCOPE_REFs.
	(tsubst_qualified_id): Likewise.
	* search.c (accessible_p): Treat everything in the body of a

From-SVN: r69160
parent bb498ea3
2003-07-09 Mark Mitchell <mark@codesourcery.com>
* parser.c (cp_parser_primary_expression): Preserve the form of
qualified expressions in templates, even if they are not
dependent.
* pt.c (convert_nontype_argument): Handle non-dependent SCOPE_REFs.
(tsubst_qualified_id): Likewise.
* search.c (accessible_p): Treat everything in the body of a
template as accessible.
2003-07-08 Mark Mitchell <mark@codesourcery.com> 2003-07-08 Mark Mitchell <mark@codesourcery.com>
* cp-tree.def (NON_DEPENDENT_EXPR): New node. * cp-tree.def (NON_DEPENDENT_EXPR): New node.
......
...@@ -2648,6 +2648,12 @@ cp_parser_primary_expression (cp_parser *parser, ...@@ -2648,6 +2648,12 @@ cp_parser_primary_expression (cp_parser *parser,
return build_nt (SCOPE_REF, return build_nt (SCOPE_REF,
parser->scope, parser->scope,
id_expression); id_expression);
else if (TYPE_P (parser->scope)
&& DECL_P (decl))
return build (SCOPE_REF,
TREE_TYPE (decl),
parser->scope,
id_expression);
else else
return decl; return decl;
} }
...@@ -2705,6 +2711,11 @@ cp_parser_primary_expression (cp_parser *parser, ...@@ -2705,6 +2711,11 @@ cp_parser_primary_expression (cp_parser *parser,
*qualifying_class = parser->scope; *qualifying_class = parser->scope;
else if (!processing_template_decl) else if (!processing_template_decl)
decl = convert_from_reference (decl); decl = convert_from_reference (decl);
else if (TYPE_P (parser->scope))
decl = build (SCOPE_REF,
TREE_TYPE (decl),
parser->scope,
decl);
} }
else else
/* Transform references to non-static data members into /* Transform references to non-static data members into
......
...@@ -3054,7 +3054,6 @@ convert_nontype_argument (tree type, tree expr) ...@@ -3054,7 +3054,6 @@ convert_nontype_argument (tree type, tree expr)
goto bad_argument; goto bad_argument;
} }
else if (TYPE_PTR_P (expr_type) else if (TYPE_PTR_P (expr_type)
|| TYPE_PTRMEM_P (expr_type)
|| TREE_CODE (expr_type) == ARRAY_TYPE || TREE_CODE (expr_type) == ARRAY_TYPE
|| TREE_CODE (type) == REFERENCE_TYPE || TREE_CODE (type) == REFERENCE_TYPE
/* If expr is the address of an overloaded function, we /* If expr is the address of an overloaded function, we
...@@ -3100,6 +3099,9 @@ convert_nontype_argument (tree type, tree expr) ...@@ -3100,6 +3099,9 @@ convert_nontype_argument (tree type, tree expr)
return NULL_TREE; return NULL_TREE;
} }
if (TREE_CODE (referent) == SCOPE_REF)
referent = TREE_OPERAND (referent, 1);
if (is_overloaded_fn (referent)) if (is_overloaded_fn (referent))
/* We'll check that it has external linkage later. */ /* We'll check that it has external linkage later. */
; ;
...@@ -7160,14 +7162,13 @@ tsubst_qualified_id (tree qualified_id, tree args, ...@@ -7160,14 +7162,13 @@ tsubst_qualified_id (tree qualified_id, tree args,
} }
expr = tsubst_copy (name, args, complain, in_decl); expr = tsubst_copy (name, args, complain, in_decl);
if (!BASELINK_P (name)) if (!BASELINK_P (name)
{ && !DECL_P (expr))
expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0); expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0);
if (DECL_P (expr)) if (DECL_P (expr))
check_accessibility_of_qualified_id (expr, check_accessibility_of_qualified_id (expr,
/*object_type=*/NULL_TREE, /*object_type=*/NULL_TREE,
scope); scope);
}
/* Remember that there was a reference to this entity. */ /* Remember that there was a reference to this entity. */
if (DECL_P (expr)) if (DECL_P (expr))
......
...@@ -903,6 +903,13 @@ accessible_p (tree type, tree decl) ...@@ -903,6 +903,13 @@ accessible_p (tree type, tree decl)
if (!TYPE_P (context_for_name_lookup (decl))) if (!TYPE_P (context_for_name_lookup (decl)))
return 1; return 1;
/* In a template declaration, we cannot be sure whether the
particular specialization that is instantiated will be a friend
or not. Therefore, all access checks are deferred until
instantiation. */
if (processing_template_decl)
return 1;
if (!TYPE_P (type)) if (!TYPE_P (type))
{ {
binfo = type; binfo = 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