+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>
* cp-tree.def (NON_DEPENDENT_EXPR): New node.
return build_nt (SCOPE_REF,
parser->scope,
id_expression);
+ else if (TYPE_P (parser->scope)
+ && DECL_P (decl))
+ return build (SCOPE_REF,
+ TREE_TYPE (decl),
+ parser->scope,
+ id_expression);
else
return decl;
}
*qualifying_class = parser->scope;
else if (!processing_template_decl)
decl = convert_from_reference (decl);
+ else if (TYPE_P (parser->scope))
+ decl = build (SCOPE_REF,
+ TREE_TYPE (decl),
+ parser->scope,
+ decl);
}
else
/* Transform references to non-static data members into
goto bad_argument;
}
else if (TYPE_PTR_P (expr_type)
- || TYPE_PTRMEM_P (expr_type)
|| TREE_CODE (expr_type) == ARRAY_TYPE
|| TREE_CODE (type) == REFERENCE_TYPE
/* If expr is the address of an overloaded function, we
return NULL_TREE;
}
+ if (TREE_CODE (referent) == SCOPE_REF)
+ referent = TREE_OPERAND (referent, 1);
+
if (is_overloaded_fn (referent))
/* We'll check that it has external linkage later. */
;
}
expr = tsubst_copy (name, args, complain, in_decl);
- if (!BASELINK_P (name))
- {
- expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0);
- if (DECL_P (expr))
- check_accessibility_of_qualified_id (expr,
- /*object_type=*/NULL_TREE,
- scope);
- }
+ if (!BASELINK_P (name)
+ && !DECL_P (expr))
+ expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0);
+ if (DECL_P (expr))
+ check_accessibility_of_qualified_id (expr,
+ /*object_type=*/NULL_TREE,
+ scope);
/* Remember that there was a reference to this entity. */
if (DECL_P (expr))
if (!TYPE_P (context_for_name_lookup (decl)))
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))
{
binfo = type;